SnaccOvenFlour
SnaccOvenFlour

Reputation: 156

"<Order: Order object (None)>" needs to have a value for field "id" before this many-to-many relationship can be used

So I'm trying to add multiple products or order items into a order and I'm using many to many relationship for that but when I try to create that order I get "<Order: Order object (None)>" needs to have a value for field "id" before this many-to-many relationship can be used. error, My code for adding and saving that order is like:

        userObject = UserLogin.objects.get(token=finalUserToken).user
        objects = OrderItem.objects.filter(user=userObject)
        FinalOrder = Order(user=userObject, order_id=another_token)
        for orderObject in objects:
            FinalOrder.products.add(orderObject.id)
        FinalOrder.save()

The error screen is pointing to this line

FinalOrder.products.add(orderObject.id) 

I have also tried this

FinalOrder.products.add(orderObject)

but this gives the same result too

models.py

class OrderItem(models.Model):
    item_id = models.CharField(max_length=20)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    quantity = models.IntegerField()
    product = models.ForeignKey(Product, on_delete=models.DO_NOTHING)

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

class Order(models.Model):
    order_id = models.CharField(max_length=20)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    products = models.ManyToManyField(OrderItem)

    def __str__(self):
        return self.user.username

Upvotes: 1

Views: 583

Answers (1)

JPG
JPG

Reputation: 88649

You need to call the save() method before the loop

userObject = UserLogin.objects.get(token=finalUserToken).user
objects = OrderItem.objects.filter(user=userObject)
FinalOrder = Order(user=userObject, order_id=another_token)

FinalOrder.save() # call the `save()` method here

for orderObject in objects:
    FinalOrder.products.add(orderObject.id)

Alternatively, you can commit the usage of for loop with list-unpacking

userObject = UserLogin.objects.get(token=finalUserToken).user
objects = OrderItem.objects.filter(user=userObject)
FinalOrder = Order(user=userObject, order_id=another_token)

FinalOrder.save()
FinalOrder.products.add(*objects)

Upvotes: 2

Related Questions