在 Django 序列化程序中同时访问 2 个外键字段

accessing 2 foreign key fields at the same time in django serializers

我的 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 来检索“公司”模型的实例,并为我提供他们生产的产品列表以及他们进口的产品的另一个列表

现在我知道只用一个 manytomany 字段就可以做到这一点,我可以做到以下几点:

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__'

但是由于产品模型中有两个字段引用了公司模型,所以这不起作用。有什么办法可以解决这个问题吗?

这不起作用的原因是因为您指定了 related_name='producer'related_namereverse 中关系的名称,所以它没有太大作用给这个制作人起名字是有意义的。您可以将关系重命名为:

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

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

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