Одновременный доступ к двум полям внешнего ключа в сериализаторах 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__'
Вернуться на верх