ValueError:在使用此多个关系之前,需要为字段“id”设置一个值

2024-05-18 10:16:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个像电子商务网站这样的项目。到目前为止一切正常,但如果用户购物车/购物袋中没有任何内容,则会发生错误。 我尝试过保存方法,但我认为我做错了什么。有人能帮我解决这个问题吗

views.py

def your_cart(request):
    user = User.objects.getFromUser(request.user)
    order = models.Order.objects.filter(owner = user, is_ordered = False)
    if (len(order)==0):
        order = models.Order()
        order.owner = user
    else:
        order = order[0]
    items = order.items.all()
    if request.method == 'POST':
        demand_date = request.POST.get('demand_date')
        demand_date_obj = datetime.strptime(demand_date,"%m/%d/%Y %I:%M %p")
        order.demand_date = localtime.localize(demand_date_obj)
        order.save()
    return render(request, "Inventory/client_inventory/checkout.html", {'items':items})

models.py

class Order(models.Model):
    owner = models.ForeignKey('user.User', on_delete=models.SET_NULL, null=True)
    is_empty = models.BooleanField(default=True)
    is_ordered = models.BooleanField(default=False)
    items = models.ManyToManyField(OrderItem)
    date_ordered = models.DateTimeField(auto_now_add=True)
    pickup_date = models.DateTimeField(blank=True, null=True)
    pickup_place = models.CharField(max_length=100,default='')
    description = models.CharField(max_length=100,default='')
    is_approved = models.BooleanField(default=False)
    is_returned = models.BooleanField(default=False)
    demand_date = models.DateTimeField(blank=True, null=True)
    def get_cart_items(self):
        return self.items.all()
    def __str__(self):
        return '{0}'.format(self.owner)
    def dict(self):
        return {
            'id':self.id,
            'owner':self.owner,
            'date_ordered':self.date_ordered.isoformat() if self.date_ordered != None else '',
            'is_approved':'Approved' if self.is_approved == True else 'Declined',
            'pickup_date':self.pickup_date.isoformat() if self.pickup_date != None else '',
            'pickup_place':self.pickup_place,
            'description':self.description,
            'is_returned':self.is_returned,
            'demand_date':self.demand_date.isoformat() if self.demand_date != None else '',
        }

错误和回溯

"<Order: admin>" needs to have a value for field "id" before this many-to-many relationship can be used.

    Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/modules/smart_inventory/homepage/checkout

Django Version: 2.2.3
Python Version: 3.7.6
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'authentication',
 'home',
 'modules.user',
 'modules.module_manager',
 'modules.exampleapp',
 'modules.smartInventory']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/Users/krtp/.pyenv/versions/3.7.6/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/Users/krtp/.pyenv/versions/3.7.6/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "/Users/krtp/.pyenv/versions/3.7.6/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/krtp/.pyenv/versions/3.7.6/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
  21.                 return view_func(request, *args, **kwargs)

File "/Users/krtp/Desktop/Services_PublicVersion/modules/smartInventory/views_client.py" in your_cart
  41.     items = order.items.all()

File "/Users/krtp/.pyenv/versions/3.7.6/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/fields/related_descriptors.py" in __get__
  527.         return self.related_manager_cls(instance)

File "/Users/krtp/.pyenv/versions/3.7.6/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/models/fields/related_descriptors.py" in __init__
  840.                                  (instance, self.pk_field_names[self.source_field_name]))

Exception Type: ValueError at /modules/smart_inventory/homepage/checkout
Exception Value: "<Order: admin>" needs to have a value for field "id" before this many-to-many relationship can be used.

先谢谢你


Tags: djangopyselfmodulestruedateismodels
1条回答
网友
1楼 · 发布于 2024-05-18 10:16:59

这里的问题是,当用户下没有订单对象时,您试图处理这种情况。 多对多关系要求对象位于db中。ie当用户下的订单为空时,您要么必须保存它,要么应该使用create(),而不是声明Order对象

或者你可以试试这个

if (len(order)==0):
    order = models.Order()
    order.owner = user
    order.save()
else:
    order = order[0]

相关问题 更多 >