How can i auto update my database in django rest?

Viewed 22

I have to make a order status, where there are 3 columns: orderId, item_name, status. An order can have multiple items, and every item can have diferemt status. So what i have to do is an endpoint that return the status of the order. Example: if the order 1, has 3 items, and 2 of the items have the status: "Shipped" and the other is "Pending", the expected result of that order status is "Pending", because not all the item have been shipped.

models.py


 from django.db import models
import requests


class OrderStatus(models.Model):
    choice = (('SHIPPED', 'SHIPPED'), ('PENDING', 'PENDING'), ('CANCELLED', 'CANCELLED'))
    OrderNumber = models.CharField(max_length=255, unique=True)
    status = models.CharField(max_length=255, choices=choice)


    def __str__(self):
        return self.OrderNumber


class OrderItems(models.Model):
    id = models.AutoField(primary_key=True)
    choice = (('SHIPPED', 'SHIPPED'), ('PENDING', 'PENDING'), ('CANCELLED', 'CANCELLED'))
    itemName = models.CharField(max_length=255)
    OrderNumber = models.ForeignKey(OrderStatus, related_name='items', on_delete=models.CASCADE)
    status = models.CharField(max_length=255, choices=choice)

    def __str__(self):
        return self.status

Views.py

from rest_framework.viewsets import ModelViewSet
from OrderStatus.api.serializers import OrderRegisterSerializer, NumberOrderSerializer
from OrderStatus.models import OrderItems, OrderStatus


class OrderApiViewSet(ModelViewSet):
    serializer_class = OrderRegisterSerializer
    queryset = OrderItems.objects.all()



class OrderNumberApiviewSet(ModelViewSet):
    serializer_class = NumberOrderSerializer
    queryset = OrderStatus.objects.all()

serializers.py

from OrderStatus.models import OrderItems, OrderStatus
from rest_framework import serializers


class OrderRegisterSerializer(serializers.ModelSerializer):
    #items = serializers.RelatedField(many=True, queryset = OrderItems.objects.all())

    class Meta:
        model = OrderItems
        fields = ['itemName', 'OrderNumber', 'status']
        order_by = 'OrderNumber'


class NumberOrderSerializer(serializers.ModelSerializer):
    #test = serializers.CharField(source='OrderItems.status', read_only=True)
    #data= OrderItems.objects.filter(OrderNumber__contains= = '1')
    class Meta:
        model = OrderStatus
        fields = ['OrderNumber', 'status', 'OrderItems']
1 Answers

convert status field to a property something like this:

class OrderStatus(models.Model):
    choice = (('SHIPPED', 'SHIPPED'), ('PENDING', 'PENDING'), ('CANCELLED', 'CANCELLED'))
    OrderNumber = models.CharField(max_length=255, unique=True)

    def __str__(self):
        return self.OrderNumber
    @property
    def status(self)->str:
        # do your logic to get the correct status here
        return "SHIPPED"

then in the serializer add:

status = serializers.CharField(required=False, read_only=True)

    
Related