Привет сообщество 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..>