在 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_name
是 reverse 中关系的名称,所以它没有太大作用给这个制作人起名字是有意义的。您可以将关系重命名为:
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__'
我的 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_name
是 reverse 中关系的名称,所以它没有太大作用给这个制作人起名字是有意义的。您可以将关系重命名为:
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__'