Как проверить дочерний сериализатор, который требует данных от родителя в django rest framework nested serializer? - PullRequest
1 голос
/ 18 марта 2020

Я использую DRF Writable Nested для создания доступного для записи вложенного сериализатора.

Мне нужно проверить 'ItemDetail', но для него требуется 'product_id', который присутствует в родительском сериализаторе, т.е. 'InvoiceItem '.

Модели

class InvoiceItem(models.Model):
    product = models.ForeignKey(
        Product, on_delete=models.CASCADE, related_name="invoice_items"
    )


class ItemDetail(models.Model):
    invoice_item = models.ForeignKey(
        InvoiceItem, on_delete=models.CASCADE, related_name="item_details"
    )
    size = models.ForeignKey(
        Size, on_delete=models.CASCADE, related_name="item_details"
    )
    quantity = models.PositiveIntegerField()

Сериализаторы

class InvoiceItemSerializer(WritableNestedModelSerializer):
    product = ProductMiniSerializer(read_only=True)
    product_id = serializers.IntegerField(write_only=True)
    item_details = ItemDetailSerializer(many=True)

    class Meta:
        model = InvoiceItem
        fields = [
            "id",
            "product_id",
            "product",
            "item_details",
        ]


class ItemDetailSerializer(serializers.ModelSerializer):

    class Meta:
        model = ItemDetail
        fields = [
            "id",
            "size",
            "quantity",
        ]

    def validate(self, data):
        return item_detail_validate(self, data)

Валидатор

def item_detail_validate(self, data):
    # How to get product_id here so I can use it in a query
    return data

1 Ответ

1 голос
/ 18 марта 2020

Доступ к атрибуту initial_data сериализатора,

def validate(self, data):
    <b>product_id = self.initial_data['product_id']</b>
    return item_detail_validate(self, data)
...