Django:在创建之前检查实例是否存在
Django: Check if an instance exists before creating
我有两个模型 Purchaser
和 paymentInvoice
,我想确保在创建新的 paymentInvoice
时不会创建重复的 Purchaser
对象] 同样 Purchaser
individual/instance.
基本上我有一个名为 Becky 的 Purchaser
,所以当我想为 Becky 1st 创建发票时我想确定名称 Becky 是否存在于 Purchaser
中,如果存在,则使用 Becky 创建 paymentInvoice
对象字段 invoiceOwner
。如果 Becky 在 Purchaser
中不存在,则在 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()
我有两个模型 Purchaser
和 paymentInvoice
,我想确保在创建新的 paymentInvoice
时不会创建重复的 Purchaser
对象] 同样 Purchaser
individual/instance.
基本上我有一个名为 Becky 的 Purchaser
,所以当我想为 Becky 1st 创建发票时我想确定名称 Becky 是否存在于 Purchaser
中,如果存在,则使用 Becky 创建 paymentInvoice
对象字段 invoiceOwner
。如果 Becky 在 Purchaser
中不存在,则在 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()