Django:在创建之前检查实例是否存在

Django: Check if an instance exists before creating

我有两个模型 PurchaserpaymentInvoice,我想确保在创建新的 paymentInvoice 时不会创建重复的 Purchaser 对象] 同样 Purchaser individual/instance.

基本上我有一个名为 BeckyPurchaser,所以当我想为 Becky 1st 创建发票时我想确定名称 Becky 是否存在于 Purchaser 中,如果存在,则使用 Becky 创建 paymentInvoice 对象字段 invoiceOwner。如果 BeckyPurchaser 中不存在,则在 Purchaser 中创建该购买者的实例,然后使用该实例名称创建 paymentInvoice 对象。

型号文件

class Purchaser(models.Model):
    name = models.CharField(max_length=50)
    phone = models.CharField(max_length=20)
    email = models.EmailField(max_length=255, blank=True, null=True)
    image = models.ImageField(default='default.png', upload_to='customer_photos/%Y/%m/%d/')
    data_added = models.DateField(default=datetime.date.today)

    def __str__(self):
        return self.name


class paymentInvoice(models.Model):

    invoiceNo = models.CharField(max_length=50, unique=True, default=increment_invoice_number)
    invoiceOwner = models.ForeignKey(Purchaser, on_delete=models.CASCADE, related_name="invoice_detail")
    product = models.CharField(max_length=50, blank=True)
    date = models.DateField(default=datetime.date.today)
    quantity = models.PositiveSmallIntegerField(blank=True, default=1)
    payment_made = models.IntegerField(default=0)

    def __str__(self):
        return self.invoiceOwner.name

序列化程序 文件

class paymentInvoiceSerializer(serializers.ModelSerializer):
    invoiceOwner = purchaserSerializer(many=False)
    invoiceOwner = serializers.CharField(source='invoiceOwner.name')

    class Meta:
        model = paymentInvoice
        fields = '__all__'

    def create(self, validated_data):
        purchaser_data = validated_data.pop("invoiceOwner")

        purchaser, _ = Purchaser.objects.get_or_create(**purchaser_data).first()
        validated_data.update({"invoiceOwner": purchaser})

        return paymentInvoice.objects.create(**validated_data)

浏览量 文件

class PurchaserListCreateView(ListCreateAPIView):
    serializer_class = purchaserSerializer
    queryset = Purchaser.objects.all()

class paymentInvoiceListCreateView(ListCreateAPIView):
    serializer_class = paymentInvoiceSerializer
    queryset = paymentInvoice.objects.all().order_by('-date')

POST 在 Postman 中请求模型 paymentInvoice

{
    "invoiceOwner":"Becky",
    "product": "Lix",
    "quantity": 1,
    "payment_made": 3000
}

我的方法不起作用,我从 PostMan 收到错误

MultipleObjectsReturned at /api/clients/invoice/ get() returned more than one Purchaser -- it returned 2!

您可以先查看记录,如果没有找到,然后创建一个如下所示

    def create(self, validated_data):
        purchaser_data = validated_data.pop("invoiceOwner")

        purchaser = Purchaser.objects.filter(**purchaser_data).first()
        if purchaser is None:
             purchaser = Purchaser.objects.create(**purchaser_data)
        validated_data.update({"invoiceOwner": purchaser})

        return paymentInvoice.objects.create(**validated_data)

可能 get_or_create 也应该工作,只是我认为你应该重新定义 get_or_create 而不是创建方法。

  def get_or_create(self):
   purchaser_data = validated_data.pop("invoiceOwner")
   purchase,created = Purchase.objects.get_or_create(**purchaser_data)
   validated_data.update({"invoiceOwner": purchaser})
   payment_invoice = paymentInvoice.objects.create(**validated_data)
   return payment_invoice,created

可见:

model_serializer = paymentInvoiceSerializer(data=request.data)
if model_serializer.is_valid():
   payment_invoice,_ = model_serializer.get_or_create()