我需要丢弃所有没有关联图像的记录。这必须在序列化程序中实现。
如果意见中有解决方案,也欢迎。
我有这些模型
class Activity(models.Model):
""" Class Activity """
name = models.CharField(max_length = 200, null = False, blank = False)
create_at = models.DateTimeField('Create date', auto_now_add = True, editable = False)
update_at = models.DateTimeField('Last update', auto_now = True)
class Image(models.Model):
""" Image of an activity """
activity = models.ForeignKey(Activity, related_name = 'images', on_delete = models.CASCADE)
image = models.ImageField(upload_to = 'files/images')
然后是序列化器
class ImageModelSerializer(serializers.ModelSerializer):
""" Image model serializer """
class Meta:
model = Image
fields = ('id', 'image')
class ActivityModelSerializer(serializers.ModelSerializer):
""" Activity model serializer """
images = ImageModelSerializer(read_only = True, many = True)
class Meta:
model = Activity
fields = ('id', 'name', 'images', 'create_at')
以下是我需要得到的响应示例。
示例:
[
{
"id": 1,
"name": "Activity 1",
"images": [
{"id": 1, "image": "path to image 1"},
{"id": 2, "image": "path to image 2"}
],
"create_at": "2021-04-07T15:58:15.409054Z"
},
{
"id": 3,
"name": "Activity 3",
"images": [
{"id": 3, "image": "path to image 1"},
{"id": 4, "image": "path to image 2"}
],
"create_at": "2021-04-07T15:58:15.409054Z"
}
]
[
{
"id": 1,
"name": "Activity 1",
"images": [
{"id": 1, "image": "path to image 1"},
{"id": 2, "image": "path to image 2"}
],
"create_at": "2021-04-07T15:58:15.409054Z"
},
{
"id": 2,
"name": "Activity 2",
"images": [],
"create_at": "2021-04-07T15:58:15.409054Z"
},
{
"id": 3,
"name": "Activity 3",
"images": [
{"id": 3, "image": "path to image 1"},
{"id": 4, "image": "path to image 2"}
],
"create_at": "2021-04-07T15:58:15.409054Z"
}
]
谢谢你能帮助我!
答案 0 :(得分:0)
您需要覆盖 API 视图中的查询集:
class ActivityModelSerializerViewSet(viewsets.ModelViewSet):
queryset = Activity.objects.filter(add_filtering_rules_here)
serializer_class = ActivityModelSerializer
此外,您需要检查图像字段在数据库中的表示方式,以便设置正确的过滤器。可能这个(或类似的)应该可以工作,但你必须先测试它:
Activity.objects.filter(images__image__isnull=False)
Activity.objects.exclude(images__image='')