get() вернул более одного порядка — он вернул 2

#python #django

#python #django

Вопрос:

На самом деле я хочу создать виртуальную платежную систему, но всякий раз, когда клиент хочет оплатить свой первый заказ, он проходит успешно, но во 2-й раз я сталкиваюсь с этой ошибкой.Я не знаю, почему я получаю эту ошибку, может кто-нибудь, пожалуйста, помогите мне решить эту проблему

Вот мой :

Model.py

 class Customer(models.Model):
    phone_number = models.CharField(max_length=100, default=1)
    email = models.EmailField( default=1)
    password = models.CharField(max_length=100)
    coin = models.IntegerField(null=True, blank=True, default=0000.00)
    # user = models.ForeignKey(User, related_name='customer', on_delete=models.CASCADE, blank=True, null=True)

    def __str__(self):
        return self.phone_number
class Order(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="product")
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)
    fname = models.CharField(max_length=100, null=True)
    address = models.CharField(max_length=1000, null=True)
    phone = models.CharField(max_length=12, null=True)
    price = models.IntegerField()
    date = models.DateField(datetime.datetime.today, null=True)
    status = models.ForeignKey(Status, on_delete=models.CASCADE, blank=True, null=True)
    payment_method = models.ForeignKey(PaymentMethod, on_delete=models.CASCADE, blank=True, null=True)
    total = models.IntegerField(null=True, blank=True)


    def save(self, *args, **kwargs):
        self.total = self.price * self.quantity
        return super().save(self, *args, **kwargs)
 

Вот мой views.py:

 def post(self, request, *args, **kwargs):
        customer = Customer.objects.get(id=request.session['customer']['id'])
        print(customer)
        try:
            index, created = Order.objects.get_or_create(customer=customer)
            # print(index.total)
        except Order.MultipleObjectsReturned:
            index = Order.objects.get(customer=customer)


        # index = Order.objects.get(customer=customer)
        # print(index.total)


        balance = request.session['customer']['coin']
        print(balance)
        if balance >= index.total:
            balance = balance - index.total
            print(balance)
            # Customer.objects.filter(id = request.session['customer']['id']).update(coin=balance)
            customer = Customer.objects.get_or_create(id = request.session['customer']['id'])
            customer.coin = balance
            customer.save()
            request.session['customer']['coin'] = balance

            return HttpResponse("Remaining balance: "   str(balance))

        return HttpResponse("Failed")
 

Комментарии:

1. Это означает, что есть два заказа для одного и того же клиента, поэтому Order.objects.get_or_create(customer=customer) не может работать, так как есть два заказа, которые удовлетворяют заданному фильтру.

2. Тот факт, что вы используете позже Order.objects.get(..) , не решит проблему, поскольку это вызовет ту же ошибку.

3. Итак , каково же решение этой проблемы ?? @WillemVanOnsem

4. Как сказал @WillemVanOnsem — вам нужно указать, что именно вы хотите сделать… Я также добавлю дополнительное замечание о том, что ваше моделирование выглядит немного странно… Один продукт и количество в Order не имеет особого смысла — возможно, вам захочется подумать о Order том, чтобы иметь сводную и связанную Customer информацию, а также модель с именем OrderLine или аналогичную, которая содержит продукт, количество, цену и т. Д. Со связанными Order

5. Что вам нужно сделать, так это иметь один «активный» заказ для клиента, у клиента может быть несколько «завершенных» или «отправленных» заказов, но должен быть один не завершенный заказ. Я вижу, что у вашего заказа есть атрибут status, работайте с этим.