【问题标题】:accessing 2 foreign key fields at the same time in django serializers在 django 序列化程序中同时访问 2 个外键字段
【发布时间】:2022-01-22 17:04:43
【问题描述】:

我的 django rest 框架项目中有以下模型。在这个项目中有产品,他们有生产商和进口商。

# models.py
class Product(models.Model):
    name = models.CharField(max_length=255)
    producer = models.ManyToManyField(Company, related_name='producer')
    importer = models.ManyToManyField(Company, related_name='importer')

class Company(models.Model):
    name = models.CharField(max_length=255)

我需要创建一个 API 来检索“公司”模型的一个实例,并为我提供他们生产的产品的列表和他们进口的产品的另一个列表

现在我知道只使用一个多对多字段来执行此操作,我可以执行以下操作:

class CompanyRetrieveSerializer(serializers.ModelSerializer):
    class ProductSerializer(serializers.ModelSerializer):
        class Meta:
            model = Product
            fields = ('name',)
    
    product_set = ProductSerializer(read_only=True, many=True,)
    class Meta:
        model = Company
        fields = '__all__'

但由于产品模型中有两个字段引用了公司模型,因此这不起作用。有没有办法解决这个问题?

【问题讨论】:

  • 输出是否应该包含 两个 列表(一个用于生产项目,一个用于进口项目),或者一个列表是“联合 ”的两个。
  • 最好是两个单独的列表。

标签: django django-models django-rest-framework django-serializer


【解决方案1】:

这不起作用的原因是因为您指定了related_name='producer'related_namereverse 中关系的名称,所以命名这个生产者没有多大意义。您可以将关系重命名为:

class Product(models.Model):
    name = models.CharField(max_length=255)
    producer = models.ManyToManyField(Company, related_name='produced_products')
    importer = models.ManyToManyField(Company, related_name='imported_products')

然后你可以序列化这两个关系:

class CompanyRetrieveSerializer(serializers.ModelSerializer):
    class ProductSerializer(serializers.ModelSerializer):
        class Meta:
            model = Product
            fields = ('name',)
    
    produced_products = ProductSerializer(read_only=True, many=True)
    imported_products = ProductSerializer(read_only=True, many=True)
    
    class Meta:
        model = Company
        fields = '__all__'

【讨论】:

    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2023-04-01
    相关资源
    最近更新 更多