Django Rest Framework Получить дополнительные связанные поля в отношении один ко многим - PullRequest
0 голосов
/ 04 сентября 2018

Вот проблема. У продуктов есть несколько размеров, отношение многих ко многим

Продукты

|-------|---------|
|   ID  |  Title  |
|-------|---------|

Размеры

|-------|---------|
|   ID  |  Title  |
|-------|---------|

Размер до

|------|--------------|-----------|---------|
|  ID  |  Product ID  |  Size ID  |  Stock  |
|------|--------------|-----------|---------|

Мне удается получить размеры в API моего продукта с помощью Django Rest Framework, но я также не знаю, как получить информацию о запасах. вот код, который я

class SizeSerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'id',
            'title',
        )
        model = Size



class ProductsSerializer(serializers.ModelSerializer):
    sizes = SizeSerializer(many=True)

    class Meta:
        fields = (
            'url',
            'id',
            'title',
            "sizes",
        )
        model = Products

Буду признателен за помощь в решении этой проблемы

Модель

class Products(models.Model):
    title = models.CharField(max_length=125)
    sizes = models.ManyToManyField(Size, blank=True, through='SizeThrough')

    class Meta:
        verbose_name_plural = 'Products'
        verbose_name = 'Product'

    def __str__(self):
        return self.title

class SizeThrough(models.Model):
    size = models.ForeignKey(Size, on_delete=models.CASCADE)
    product = models.ForeignKey(Products, on_delete=models.CASCADE)
    stock = models.BooleanField(null=False, default=1)

class Size(models.Model):
    title = models.CharField(max_length=20)

    def __str__(self):
        return self.title

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

вы должны получить от Size до SizeThrough (вы пытаетесь наоборот):

class SizeSerializer(serializers.ModelSerializer):
    class Meta:
        fields = (
            'id',
            'title',
        )
        model = Size


class SizeThroughSerializer(serializers.ModelSerializer):
    size = SizeSerializer()
    class Meta:
        fields = (
            'stock',
            'size',
        )
        model = SizeThrough


class ProductsSerializer(serializers.ModelSerializer):
    sizes_info = SizeThroughSerializer(source='sizethrough_set', many=True)

    class Meta:
        fields = (
            'url',
            'id',
            'title',
            "sizes_info",
        )
        model = Products
0 голосов
/ 04 сентября 2018

Можете ли вы попробовать это. Может быть, это работает

class ProductsSerializer(serializers.ModelSerializer):
    sizes = SizeSerializer(many=True)
    stock = serializers.SerializerMethodField()

    def get_stock(self, obj):
         return[(x.stock, x.size) for x in SizeThrough.objects.filter(product=obj)]

    class Meta:
        fields = (
        'url',
        'id',
        'title',
        "sizes",
        "stock",
    )
        model = Products
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...