Django: проверьте, существует ли экземпляр перед созданием - PullRequest
0 голосов
/ 06 августа 2020

У меня две модели Purchaser и paymentInvoice, я хочу убедиться, что я не создаю дубликат Purchaser объекта, когда я создаю новый paymentInvoice для того же Purchaser индивидуального / экземпляра .

Обычно у меня есть Purchaser с именем Becky , поэтому, когда я хочу создать счет для Becky 1st, я хочу убедиться, что имя Becky существует в Purchaser, если это так, создайте объект paymentInvoice с Becky , заняв поле 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 () вернул более одного покупателя - он вернул 2!

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Вы можете сначала проверить запись, если она не найдена, а затем создать ее, как показано ниже

    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)
0 голосов
/ 06 августа 2020

Вероятно, get_or_create также должен работать, просто я думаю, вам следует заново определить метод get_or_create, а не 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...