Django Rest Framework - 嵌套关系的过滤字段
Django Rest Framework - Filter fields of nested relationships
我想要 return Customer
与 Image
对象的嵌套表示,其中 Customer
可以有许多 Images
.
目前,GET 请求 return 是每个 Customer
对象的 Image
查询集中 ALL 图像的列表,如下所示。
我如何才能只显示列表中每个 Customer
对象的相关 Image
(s)?
# The 'images' field currently returns all images rather than related images to the customer id.
[
{
'id': 1,
'name': 'John Doe',
'images': [
{'id': 1, 'name': 'foo.jpg', 'customer': 1},
{'id': 2, 'name': 'bar.jpg', 'customer': 2},
{'id': 3, 'name': 'foobar.jpg', 'customer': 3},
...
]
},
{
'id': 2,
'name': 'Jane Doe',
'images': [
{'id': 1, 'name': 'foo.jpg', 'customer': 1},
{'id': 2, 'name': 'bar.jpg', 'customer': 2},
{'id': 3, 'name': 'foobar.jpg', 'customer': 3},
...
]
},
...
]
这是我当前的设置
示例模型
class Customer(models.Model):
name = models.CharField()
class Image(models.Model):
name = models.CharField()
customer = models.ForeignKey(
Customer, on_delete=models.CASCADE)
示例序列化器
class CustomerSerializer(serializers.ModelSerializer):
# My Customer nested relationship is expressed using ImageSerializer as a field
images = ImageSerializer(many=True)
class Meta:
model = Customer
fields = ('id', 'name', 'images')
read_only_fields = ('id',)
class ImageSerializer(serializers.ModelSerializer):
class Meta:
model = Image
fields = '__all__'
read_only_fields = ('id',)
如果我的问题不清楚,请告诉我,我会更新我的问题。谢谢。
您需要使用相关名称作为反向外键的字段。
在你的情况下,这将是;
class CustomerSerializer(serializers.ModelSerializer):
class Meta:
model = Customer
fields = ('id', 'name', 'image_set')
read_only_fields = ('id',)
将其视为反向 FK 查询 - Customer.objects.first().image_set.all()
关于此的 DRF 文档在这里; Reverse Relations
关于反转关系的 Django 文档是 here
像这样使用_set
反向查找是django的默认设置。您可以将自己的 related_name
添加到关系中。
django 文档中的示例;
# Declare the ForeignKey with related_query_name
class Tag(models.Model):
article = models.ForeignKey(
Article,
on_delete=models.CASCADE,
related_name="tags",
related_query_name="tag",
)
name = models.CharField(max_length=255)
# That's now the name of the reverse filter
Article.objects.filter(tag__name="important")
对于您的示例,您可以添加类似的内容;
class Image(models.Model):
name = models.CharField()
customer = models.ForeignKey(
Customer,
on_delete=models.CASCADE,
related_name="images"
)
django 默认值 Customer.image_set
仍然有效,但您可以随后执行 Customer.images.all()
因为您已经为关系定义了 related_name
。
我想要 return Customer
与 Image
对象的嵌套表示,其中 Customer
可以有许多 Images
.
目前,GET 请求 return 是每个 Customer
对象的 Image
查询集中 ALL 图像的列表,如下所示。
我如何才能只显示列表中每个 Customer
对象的相关 Image
(s)?
# The 'images' field currently returns all images rather than related images to the customer id.
[
{
'id': 1,
'name': 'John Doe',
'images': [
{'id': 1, 'name': 'foo.jpg', 'customer': 1},
{'id': 2, 'name': 'bar.jpg', 'customer': 2},
{'id': 3, 'name': 'foobar.jpg', 'customer': 3},
...
]
},
{
'id': 2,
'name': 'Jane Doe',
'images': [
{'id': 1, 'name': 'foo.jpg', 'customer': 1},
{'id': 2, 'name': 'bar.jpg', 'customer': 2},
{'id': 3, 'name': 'foobar.jpg', 'customer': 3},
...
]
},
...
]
这是我当前的设置
示例模型
class Customer(models.Model):
name = models.CharField()
class Image(models.Model):
name = models.CharField()
customer = models.ForeignKey(
Customer, on_delete=models.CASCADE)
示例序列化器
class CustomerSerializer(serializers.ModelSerializer):
# My Customer nested relationship is expressed using ImageSerializer as a field
images = ImageSerializer(many=True)
class Meta:
model = Customer
fields = ('id', 'name', 'images')
read_only_fields = ('id',)
class ImageSerializer(serializers.ModelSerializer):
class Meta:
model = Image
fields = '__all__'
read_only_fields = ('id',)
如果我的问题不清楚,请告诉我,我会更新我的问题。谢谢。
您需要使用相关名称作为反向外键的字段。
在你的情况下,这将是;
class CustomerSerializer(serializers.ModelSerializer):
class Meta:
model = Customer
fields = ('id', 'name', 'image_set')
read_only_fields = ('id',)
将其视为反向 FK 查询 - Customer.objects.first().image_set.all()
关于此的 DRF 文档在这里; Reverse Relations
关于反转关系的 Django 文档是 here
像这样使用_set
反向查找是django的默认设置。您可以将自己的 related_name
添加到关系中。
django 文档中的示例;
# Declare the ForeignKey with related_query_name
class Tag(models.Model):
article = models.ForeignKey(
Article,
on_delete=models.CASCADE,
related_name="tags",
related_query_name="tag",
)
name = models.CharField(max_length=255)
# That's now the name of the reverse filter
Article.objects.filter(tag__name="important")
对于您的示例,您可以添加类似的内容;
class Image(models.Model):
name = models.CharField()
customer = models.ForeignKey(
Customer,
on_delete=models.CASCADE,
related_name="images"
)
django 默认值 Customer.image_set
仍然有效,但您可以随后执行 Customer.images.all()
因为您已经为关系定义了 related_name
。