Dodatkowe dane podczas zwracania wyników zależne od inputu usera

Odpowiedz Nowy wątek
2019-09-07 16:45
0

Cześć!

Nowy dzień, nowe problemy z drf.
Case wygląda tak:
User wysyła request do api aby to udostępniło mu dane nt urządzenia + wyniki pomiarów tego urządzenia. Dodatkowo może dodać w query stringu limit co spowoduje że dostanie tyleż ostatnich wyników.

Modele:

class Device(models.Model):
    name = models.CharField(max_length=80)
    address = models.CharField(max_length=17)

class Result(models.Model):
    temperature = models.CharField(max_length=80)
    moisture = models.CharField(max_length=80)
    light = models.CharField(max_length=80)
    conductivity = models.CharField(max_length=80)
    battery = models.CharField(max_length=80)
    date = models.DateTimeField(auto_now_add=True)
    device = models.ForeignKey('Device', related_name='statuses', on_delete=models.CASCADE)

device_model_serializer:

from rest_framework import serializers
from smarthome.models import Device
from smarthome.models import Result
from django.db import models
from smarthome.domain.serializer.result_model_serializer import ResultModelSerializer

class DeviceModelSerializer(serializers.ModelSerializer):
    results = ResultModelSerializer(many=True, source='id')
    # results = models.ForeignKey(Result, related_name='id', on_delete=models.CASCADE)

    class Meta:
        model = Device
        fields = ('id', 'name', 'address', 'results')

result_model_serializer:

from rest_framework import serializers
from smarthome.models import Result

class ResultModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Result
        fields = ('id', 'temperature', 'moisture', 'light', 'conductivity', 'battery', 'date')

Najczęściej otrzymywanym błędem jest 'DeviceModelSerializer' object has no attribute 'results' ale nie rozumiem czemu.

Dodatkowo, chciałbym aby limit wysłany był respektowany. Jak mogę to zrobić?

EDIT: Jeśli przyczyną wszystkiego jest to że model Device nie ma ustawionego dodatkowego pola jak mogę dodać mu pole relacji one to many? Jeśli w jakiś sposób się da to prosiłbym jeszcze o info czemu trzeba zrobić to tak a nie po prostu pobrać odpowiednią ilość wyników i dokleić bez zapisywania.

edytowany 1x, ostatnio: NickOver, 2019-09-07 16:49

Pozostało 580 znaków

2019-09-07 22:39
cmd
0

Najczęściej otrzymywanym błędem jest 'DeviceModelSerializer' object has no attribute 'results' ale nie rozumiem czemu.

Dlatego że model Devices nigdzie nie trzyma referencji pod 'results' dla modelu Result. W modelu Result masz:

device = models.ForeignKey('Device', related_name='statuses', on_delete=models.CASCADE)

slowo kluscz: releted_name, czyli powinnienes mieć w serializerze zamiast results:

class DeviceModelSerializer(serializers.ModelSerializer):
    statuses = ResultModelSerializer(many=True, read_only=True)
    # results = models.ForeignKey(Result, related_name='id', on_delete=models.CASCADE)

    class Meta:
        model = Device
        fields = ('id', 'name', 'address', 'statuses')

Wywal to source, jest zbedne póki co w ResultModelSerializer

Dodatkowo, chciałbym aby limit wysłany był respektowany. Jak mogę to zrobić?

Musisz odpowiednio zdefinować queryset w zależności co się dzieje widoku przekazując mu limit np: [:10], czestą praktyką jest nadpisanie get_queryset() ale to zalezy od tego co stosujesz na widokach. Jeśli to to samo co wcześniej to podejrzewam że lecisz na APIView, polecam przełączyć się się ModelViewSet jeśli jeszcze tego nie zrobiłeś.
https://docs.djangoproject.co[...]b/queries/#limiting-querysets
https://www.django-rest-frame[...]-guide/viewsets/#modelviewset

edytowany 5x, ostatnio: cmd, 2019-09-07 22:54

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0