Django RF - Как вставить в сводную таблицу, используя имя вместо идентификатора, не запрашивая идентификатор? - PullRequest
0 голосов
/ 17 февраля 2020

Например, у меня есть ff:

модели:

class Store(models.Model):
    name = models.CharField(max_length = 20)

class Product(models.Model):
    name = models.CharField(max_length = 20)

class StoreProducts(models.Model):
    store = models.ForeignKey(Store)
    product = models.ForeignKey(Product)
    qty = models.IntegerField()

, сериализатор:

class StoreProductsSerializer(serializers.ModelSerializer):
    class Meta:
        model = StoreProducts
        fields = ('store', 'product', 'qty')

И определенные значения:

Store (id, name):
 1, store_1
 2, store_2

Product (id, name):
 1, product_1
 2, product_2

Теперь в представлениях я хочу добавить в StoreProducts из почтового запроса, не запрашивая идентификаторы Store и Product, как это:

data = {
'store': 'store_1',
'product': 'product_1',
'qty': 1
}

serializer = StoreProductsSerializer(data=data)
    if serializer.is_valid():
        serializer.save()

Возможно ли это и как? Спасибо

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Вы можете принять значение, которое вы хотите, и в методе validate вы можете изменить его с помощью объекта. Но вы должны использовать уникальное поле для этого метода. Я не уверен, что это хороший способ. Есть пример:

class StoreProductsSerializer(serializers.ModelSerializer):
    class Meta:
        model = StoreProducts
        fields = ('store', 'product', 'qty')

    def validate(self, attrs):
        attrs['product'] = Product.objects.get(name=attrs['product'])
        attrs['store'] = Store.objects.get(name=attrs['store'])
        return attrs
1 голос
/ 17 февраля 2020

В этом случае вы должны использовать вложенные сериализаторы. DRF не обеспечивает функциональность create и update с вложенными сериализаторами, поэтому вам придется позаботиться и об этом.

class StoreSerializer(serializers.ModelSerializer):
    class Meta:
        model = Store
        fields = ('name',)

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ('name',)

class StoreProductsSerializer(serializers.ModelSerializer):
    store = StoreSerializer()
    product = ProductSerializer()

    class Meta:
        model = StoreProducts
        fields = ('store', 'product', 'qty')

    def create(self, validated_data):
        store = Store.objects.create(validated_data.pop('store'))
        product = Product.objects.create(validated_data.pop('product'))
        return super().create({**validated_data, 'store': store, 'product': product}) 
...