首页 > 解决方案 > 从联接表中过滤行

问题描述

我正在努力解决一个看似简单但找不到解决方案的问题:

我有一个简单的模型可以将多张照片上传到一个项目。

Class Item:
name: string

Class Photo:
item = ForeignKey(Item)
image: ImageFile
default: Boolean

我想从 REST API 中获取所有项目,但只能使用默认照片。

现在我有:

Class ItemViewSet(viewsets.ModelViewSet):
   queryset=Item,objects.all()
   serializer_class=ItemSerializer

Class PhotoSerializer(serializers.ModelSerializer):
   class Meta:
      model = Photo
      fields = ['image',
                'default']

Class ItemSerializer(serializers.ModelSerializer):
   photos=PhotoSerializer(source='photo_set', many=True)
   class Meta:
      model = Item
      fields = ['id',
                'name',
                'photos']

问题是我得到了该项目的所有照片。我不知道如何过滤照片表以仅检索默认 = True 的照片。

不可能这么难。有什么帮助吗??

非常欣赏它。

道尔顿

标签: djangodjango-rest-frameworkdjango-views

解决方案


我终于找到了解决这个问题的方法,我只想分享一下,以防其他人遇到类似情况:

脚步:

  1. 向 ForeignKey 添加一个 related_name 属性:
Class Photo:
item = ForeignKey(Item, related_name='photos', on_delete=models.CASCADE)
image: ImageFile
default: Boolean
  1. 使用您想要的查询集和过滤器在序列化程序中添加一个方法
Class PhotoSerializer(serializers.ModelSerializer):
   class Meta:
      model = Photo
      fields = ['image',
                'default']

Class ItemSerializer(serializers.ModelSerializer):
   photos=serializers.SerializerMethodField()
   class Meta:
      model = Item
      fields = ['id',
                'name',
                'photos']

   def get_photos(self, obj):
      queryset = obj.photos.filter(default=True)
      return PhotoSerializer(queryset, many=True, read_only=True).data

瞧,它有效!!!!

道尔顿


推荐阅读