Сериализатор для проверки состояния

У меня есть Django проект, в котором ресторан с заказами и столиками. Вы можете видеть ниже модель:

class Order(models.Model):
    STATUS_CHOICES = (
        ("in_progress", "In_progress"),
        ('completed', 'Completed')
    )
    table = models.ForeignKey(Table, on_delete=models.CASCADE, blank=False, null=False, related_name='order_table')
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=False, null=False, related_name='order_user')
    status = models.CharField(choices=STATUS_CHOICES, null=True, max_length=15)

Я должен ограничить создание нового заказа, если таблица все еще находится в работе. Я предполагаю, что это должно быть сделано через сериализатор, но не имею представления о валидации и как связать запрос с информацией базы данных

текущий сериализатор (стандартный):

class OrdersModelSerializer(ModelSerializer):
    class Meta:
        model = Order
        fields = "__all__"

текущий вид:

class OrdersFilter(filters.FilterSet):
    class Meta:
        model = Order
        fields = (
            'user', 'table__id', 'status',
        )


class OrdersModelViewSet(ModelViewSet):
    queryset = Order.objects.all()
    serializer_class = OrdersModelSerializer
    pagination_class = LimitOffsetPagination   
    filter_backends = (DjangoFilterBackend, OrderingFilter)
    filter_class = OrdersFilter
    ordering_fields = ('table', 'user', 'status')

Вы можете указать queryset=… из PrimaryKeyRelatedField, который исключает Table, для которых существует Order с status='in_progress':

from rest_framework import serializers

class OrdersModelSerializer(ModelSerializer):
    table = serializers.PrimaryKeyRelatedField(
        queryset=Table.objects.exclude(order_table__status='in_progress')
    )
    
    class Meta:
        model = Order
        fields = '__all__'

Примечание: Обычно лучше использовать settings.AUTH_USER_MODEL [Django-doc] для ссылки на модель пользователя, чем использовать User модель [Django-doc] напрямую. Для получения дополнительной информации вы можете посмотреть ссылка на User модель раздел документации .

Вернуться на верх