Django REST - skrýt rekonstruovat data

0

Otázka

Chtěl bych uložit nějaký data v jednom z mých pole databáze. Data je přidán do tohoto pole při rekonstrukci s POST metodou. Později, když chci zobrazit data s metodou GET nechci, že jedno pole, které mají být prezentovány.

Když jsem si PŘÍSPĚVKU jsem se rekonstruovat tento řetězec:

{
    "car_id": 3,
    "rating": 3
}

Později v views.py Dělám rekonstrukci zatímco PŘÍSPĚVEK:

@api_view(['POST'])
def car_rate(request):

    if request.method == 'POST':
        rate_data = JSONParser().parse(request)
        rate_serializer = CarRateSerializer(data=rate_data)

        if rate_serializer.is_valid():
            try:
                car_obj = Car.objects.get(pk=rate_data['car_id'])
            except Car.DoesNotExist:
                return JsonResponse({'message': 'The car with given ID does not exist!'}, status=status.HTTP_404_NOT_FOUND)
        
            # check if rate is from 1 to 5
            r = rate_serializer.validated_data['rating']
            if int(r) >= 1 and int(r) <= 5:
                rate_serializer.save()
                return JsonResponse({'message':'The rate is in the scope!'})
            else:
                return JsonResponse({'message':'The rate is NOT in the scope!'})
        
        return JsonResponse(rate_serializer.errors)

A tam je můj models.py:

class Car(models.Model):
    make = models.CharField(max_length=15)
    model = models.CharField(max_length=15)
    avg_rating = models.FloatField(default=0)

    def __str__(self):      # print it when Car instance is needed
        return self.make


class CarRate(models.Model):
    car_id = models.ForeignKey(Car, related_name='rates',
                            on_delete=models.CASCADE,
                            default=0)
    rating = models.PositiveIntegerField(default=0)

Kód dělá to funguje (nějak). Teď tam mohou být přidány sazby pro jedno auto (více sazeb) s POST moethods. Já obchodě sazby v CarRate třídy a později bude použita pro výpočet průměrné sazby pro auto. Já jen prostě nechci, aby ji vytisknout se DOSTAT.

Tohle je můj výstup právě teď:

{
    "id": 2,
    "make": "Volkswagen",
    "model": "Golf",
    "rates": [
        4,
        4,
        2,
        3
    ],
    "avg_rating": 0.0
},

Jednoduše chci rates pole, které mají být neviditelné, zatímco tisk.

Četl jsem o defer() metoda a vyzkoušel, ale nic se nestalo. Žádnou pomoc?

django django-rest-framework python
2021-11-24 00:09:06
2

Nejlepší odpověď

1

Pokud si absolutně nechci, aby pole, které mají být v databázi vůbec, pak můžete jednoduše odstranit, že pole z Serializátor pole možností (Jste jmenoval, že CarRateSerializer) Ale pokud chcete být v databázi, ale nechci, aby se to ukázat jako výstup, můžete použít extra_kwargs s 'write_only': Pravda, ve vašem serializátor třídy. Dám vám příklad jsem použil pro jeden z mých projektů

class TopicSerializer(serializers.ModelSerializer):

class Meta:
    model = Topic
    fields = ['id','title', 'totalMarks', 'status', 'categoryID']
    extra_kwargs = {'categoryID': {'write_only': True}}

pro váš kód, můžete přidat tento řádek kódu níže polí v této třídě Meta vašeho CarRateSerializer

extra_kwargs = {'rating': {'write_only': True}}

Doufám, že to by mělo vyřešit váš problém

2021-11-24 10:26:59

Hell yeah! write_only dělá přesně to, co chci, akorát jsem nechtěl skrývat rating ale rates. Ta věc s extra_kwargs nefunguje v CarSerializer, ale myslím, že kvůli read_only nastavit na True v sazby variabilní. Změnil jsem to write_only a to dělá to samé, co jste napsal. Lekce se dozvěděl, díky!
wolnio
0

Jen odstranit rating pole od, CarRateSerializer NEBO můžete vytvořit nový Serializer pro CarRate.

2021-11-24 04:31:35

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................