Одновременный доступ к двум полям внешнего ключа в сериализаторах django
У меня есть следующие модели в моем проекте django rest framework. в этом проекте есть товары и у них есть производители и импортеры.
# 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, 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__'