首页 > 解决方案 > 如何检查 DRF 中的数据库中是否已经存在记录?

问题描述

我正在研究 DRF。我正在创建一个覆盖其功能的 POST 请求 API。如果数据库中已经存在特定字段值,我想添加一个功能,然后用户无法创建发布请求,而不是收到一条他无法执行的消息。

视图.py

class PizzaOrderViewSet(viewsets.ModelViewSet):
    http_method_names = ['get', 'put', 'patch', 'post']

   def create(self, request, *args, **kwargs):
        data = request.data
        order = PizzaOrder.objects.create(
                name=data['name'], flavours=data['flavours'],
                number=data['number'], size=data['size'],
                customer_name=data['customer_name'],
                customer_address=data['customer_address']
            )
        order.save()
        serializer = PizzaOrderSerializer(order)
        return Response(serializer.data)

序列化程序.py

class PizzaOrderSerializer(serializers.ModelSerializer):
    class Meta:
       model = PizzaOrder
       validators = [
            UniqueTogetherValidator(
                queryset=PizzaOrder.objects.all(),
                fields=['name', 'flavours', 'size', 'customer_name', 'customer_address'],
                message='This field should be unique'
            )
        ]

模型.py

from django.db import models
from datetime import datetime


FLAVOURS_CHOICE = (
    ('Margarita', 'Margarita'),
    ('Marinara', 'Marinara'),
    ('Salami', 'Salami'),
)

SIZE_CHOICE = (
    ('Small', 'Small'),
    ('Medium', 'Medium'),
    ('Large', 'Large'),
)

STATUS_CHOICE = (
    ('Open', 'Open'),
    ('Accepted', 'Accepted'),
    ('Preparing', 'Preparing'),
    ('OnWay', 'OnWay'),
    ('Delivered', 'Delivered'),
)


class PizzaOrder(models.Model):
    name = models.CharField(max_length=50, blank=False)
    flavours = models.CharField(max_length=20, choices=FLAVOURS_CHOICE)
    quantity = models.IntegerField()
    size = models.CharField(max_length=10, choices=SIZE_CHOICE)
    customer_name = models.CharField(max_length=30, blank=False)
    customer_address = models.TextField(blank=False)
    ordered_time = models.DateTimeField(default=datetime.now, editable=False)
    status = models.CharField(max_length=20, choices=STATUS_CHOICE, default='Open')

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['-ordered_time']
        unique_together = ('name', 'flavours', 'quantity', 'size')

我怎么能做到这一点?

标签: ormdjango-rest-framework

解决方案


推荐阅读