获取外键 Django DRF 的对象



我想在项目类别表中获取项目图像外键的图像URL。

models.py:

class ProjectCategory(MPTTModel):
name = models.CharField(max_length = 100)
slug = models.SlugField()
banner = models.ImageField(upload_to='Project_banner', default = 'demo/demo.png')
first_image = models.ForeignKey('ProjectImage',on_delete=models.SET_NULL,null=True)
parent = TreeForeignKey('self',blank=True, null=True, related_name='children',   on_delete=models.CASCADE, db_index = True)
class ProjectImage(models.Model):
title = models.CharField(max_length = 100)
image = models.ImageField(upload_to='projectimage', default = 'demo/demo.png')
watermark_thumb = models.ImageField(upload_to='thumbs', blank=True, null=True)
thumbnail = models.ImageField(upload_to='thumbs', blank=True, null=True)
category = models.ForeignKey('ProjectCategory', null=True, blank=True, on_delete=models.CASCADE,)
description = models.TextField(max_length=1000)
created_at = models.DateTimeField(default=now, editable=True)
def __str__(self):
return self.title

serializers.py:

class ProjectCategorySerializer(serializers.ModelSerializer):
children = ProjectSubCategroySerializer(many=True, required=False)
class Meta:
model = ProjectCategory
fields = ('id','name','slug','banner','first_image','parent','children')
def get_fields(self):
fields = super().get_fields()
fields['children'] = ProjectCategorySerializer(many=True, read_only=True)
return fields

views.py:

class ProjectCategoryView(generics.ListCreateAPIView):
authentication_classes = []
permission_classes = []
pagination_class = None
queryset = ProjectCategory.objects.filter(parent__isnull=True).order_by('id')
serializer_class = ProjectCategorySerializer

urls.py:

path('projectcategories/',views.ProjectCategoryView.as_view()),

............

我不确定我是否正确理解。如果要在 json 响应中包含 first_image url,请在 ProjectCategorySerializer 中执行以下操作:

class ProjectCategorySerializer(serializers.ModelSerializer):
children = ProjectSubCategroySerializer(many=True, required=False)
photo = serializers.SerializerMethodField()
class Meta:
model = ProjectCategory
fields = ('id','name','slug','banner','first_image','parent','children', 'photo')
def get_fields(self):
fields = super().get_fields()
fields['children'] = ProjectCategorySerializer(many=True, read_only=True)
return fields
@staticmethod
def get_photo(project_category):
return project_category.first_image.image.url

让我知道这是否是你需要的。

在 models.py 文件中调用ImageFieldurl

def get_url(self):
return self.image.url

从外面,你可以通过以下方式得到这个pk

item = ProjectImage.objects.get(pk=pk)
filename = item.image.url

或者通过外键,即按项目类别pk

item = ProjectCategory.objects.prefetch_related('projectimage_set').filter(pk=pk)
filename = item.image.url

最新更新