django - 从联接表中过滤行
问题描述
我正在努力解决一个看似简单但找不到解决方案的问题:
我有一个简单的模型可以将多张照片上传到一个项目。
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 的照片。
不可能这么难。有什么帮助吗??
非常欣赏它。
道尔顿
解决方案
我终于找到了解决这个问题的方法,我只想分享一下,以防其他人遇到类似情况:
脚步:
- 向 ForeignKey 添加一个 related_name 属性:
Class Photo:
item = ForeignKey(Item, related_name='photos', on_delete=models.CASCADE)
image: ImageFile
default: Boolean
- 使用您想要的查询集和过滤器在序列化程序中添加一个方法
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
瞧,它有效!!!!
道尔顿
推荐阅读
- google-cloud-platform - “libcontainerd:无法从 containerd 接收事件:rpc 错误:代码 = 13 desc = 传输正在关闭”
- pymc3 - 如何在pymc3中模拟伯努利斯的混合物
- ansible - 当列为依赖项时,如何防止ansible角色多次运行?
- python-3.x - 使用python,如何从字节中保存有效的音频文件?
- swift - 如何检查电话号码是否已经注册了firebase swift
- javascript - 如何阻止图像在 d3.js 图中旋转?
- git - 如何使用 git bash 打开 .py 文件
- javascript - Javascript函数参数中的对象或解构?
- c# - 更新作为另一个 ObservableCollection 的结果的 ObservableCollection
- r - 如何在 RR 中将具有两列的异构数据帧拆分/重组为具有三列的数据帧