Как интегрировать данные «prefetch_related» в набор запросов и сериализатор? - PullRequest
0 голосов
/ 29 апреля 2019

Привет сообщество stackoverflow,

У меня есть две модели со случайными данными о телефонах.Queryset отправляет минимальное значение цены каждого телефона в мой API ...

models.py

class Phone(models.Model):
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=400)
    image = models.ImageField(upload_to='phone_img/', max_length=255, null=True, blank=True )
    slug_phone = models.SlugField(blank=True)

   <...>

class Price(models.Model):
    price = models.DecimalField(max_digits=6, decimal_places=2)
    date = models.DateField(null=True, blank=True) 
    phone = models.ForeignKey(Phone, on_delete=models.CASCADE)
    market = models.ForeignKey(Market, on_delete=models.CASCADE)

views.py

class PhoneAPI(generics.ListAPIView):
    queryset = Phone.objects.annotate(min_price=Min('price__price'))
    serializer_class = PhoneSerializer

serializers.py

class PhoneSerializer(serializers.ModelSerializer):
    min_price = serializers.IntegerField()

    class Meta:
        model = Phone
        fields = '__all__'

Пока все работает нормально, я получаю min_price каждого телефона в моей базе данных, представленной в моем API.

Выход API

{"count":7,"next":null,"previous":null,"results":[{"id":10,"min_price":718,"name":"SAMSUNG Galaxy S10","description":"SAMSUNG Galaxy S10, Smartphone, 128 GB, Prism Black, Dual SIM","image":"http://127.0.0.1:8000/media/phone_img/galaxy_s10.jpg","slug_phone":"samsung-galaxy-s10"}, <...and so on...>



Вопрос, который у меня есть, как получить доступ к объекту, которыйотносится к min_price каждого телефона? Например, Price.date и / или Price.market телефона.

Итак, я прочитал о prefetch_related и попробовал в своем представлении / queryset.

views.py

class PhoneAPI(generics.ListAPIView):
    queryset = Phone.objects.prefetch_related('price_set').annotate(min_price=Min('price__price'))
    serializer_class = PhoneSerializer

Пока мой API не сломался, но я также не вижу связанных данных.Нужно ли мне определенное поле в моем serializers.py представляют данные?



Обновление

Как уже упоминалось в dirkgroten, я вложил PriceSerializer в PhoneSerializer :

serializers.py

class PhoneSerializer(serializers.ModelSerializer):
    min_price = serializers.IntegerField()
    sdata = PriceSerializer(many=True, read_only=True)

    class Meta:
        model = Phone
        fields = '__all__'

class PriceSerializer(serializers.ModelSerializer):

    class Meta:
        model = Price
        fields = ('id', 'phone', 'price', 'date', 'market')


    phone = serializers.StringRelatedField()
    market = serializers.StringRelatedField()

Выход такой же, как указано выше, новых значений нет.

Выход API

{"count":7,"next":null,"previous":null,"results":[{"id":10,"min_price":718,"name":"SAMSUNG Galaxy S10","description":"SAMSUNG Galaxy S10, Smartphone, 128 GB, Prism Black, Dual SIM","image":"http://127.0.0.1:8000/media/phone_img/galaxy_s10.jpg","slug_phone":"samsung-galaxy-s10"}, <...and so on..>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...