gpt4 book ai didi

Django给无法在没有主键的情况下强制更新save()

转载 作者:行者123 更新时间:2023-12-04 02:38:13 25 4
gpt4 key购买 nike

我收到 ValueError: Cannot force an update in save() with no primary key.而代码命中异常并运行 get_or_create代码。模型在数据库中有它的表,自动增量 id field 。而且这也不是更新过程。我不明白为什么 Django 会这样。

错误:

Traceback (most recent call last):
File "x.py", line 1980, in <module>
getattr(a, islem)()
File "x.py", line 718, in method
Slug='undefined', Status=False)
File "~/env/local/lib/python2.7/site-packages/django/db/models/manager.py", line 135, in get_or_create
return self.get_query_set().get_or_create(**kwargs)
File "~/env/local/lib/python2.7/site-packages/django/db/models/query.py", line 385, in get_or_create
obj.save(force_insert=True, using=self.db)
File ~/core/modules/xx/models.py", line 78, in save
super(Categories, self).save(args, kwargs)
File "~/env/local/lib/python2.7/site-packages/django/db/models/base.py", line 460, in save
self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "x/env/local/lib/python2.7/site-packages/django/db/models/base.py", line 541, in save_base
raise ValueError("Cannot force an update in save() with no primary key.")
ValueError: Cannot force an update in save() with no primary key.

代码:
try:
category = Categories.objects.get(Code=category_code)
except ObjectDoesNotExist:
category, created = Categories.objects.get_or_create(
Name='Undefined', Code='undefined',ParentCategoryID=None, OrderID=0,
Slug='undefined', Status=False)

模型:
class Categories(models.Model):
Name = models.CharField(max_length=155)
Code = models.CharField(max_length=255)
ParentCategoryID = models.ForeignKey('self', related_name='SubCategory', null=True, blank=True)
Level = models.IntegerField(default=0, max_length=10, editable=False)
OrderID = models.IntegerField(blank=True, max_length=10)
Slug = models.SlugField(max_length=250)
CreateDate = models.DateTimeField(auto_now_add=True)
LastUpdateDate = models.DateTimeField(auto_now=True)
Status = models.BooleanField(default=True)

def save(self, *args, **kwargs):

if self.ParentCategoryID is not None:
parent = Categories.objects.get(id=self.ParentCategoryID.id)
self.Level = parent.Level + 1

if self.OrderID <= 0:
try:
top = Categories.objects.order_by('-OrderID')[0]
self.OrderID = top.OrderID + 1
except:
self.OrderID = 1
super(Categories, self).save(args, kwargs)

最佳答案

调用 super 时也需要使用 * 和 ** :

super(Categories, self).save(*args, **kwargs)

请注意,这段代码中还有一些其他奇怪的东西。主要是这一行:
parent = Categories.objects.get(id=self.ParentCategoryID.id)

无缘无故地做两个相同的查询; self.ParentCategoryID已经是父对象。你应该这样做:
parent = self.ParentCategoryID

这应该使您得出结论 ParentCategoryID名字不好;它包含实际对象,而不是 ID。

还要注意,有不少风格违规; Python 更喜欢 lower_case_with_underscore对于属性名称,Django 更喜欢单数模型名称。不过,外键的相关名称应该是复数,因为它将引用多个类别对象。所以:
class Category(models.Model):
name = models.CharField(max_length=155)
code = models.CharField(max_length=255)
parent_category = models.ForeignKey('self', related_name='sub_categories', null=True, blank=True)
...

关于Django给无法在没有主键的情况下强制更新save(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42580589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com