Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django giving无法强制在没有主键的save()中进行更新_Django - Fatal编程技术网

Django giving无法强制在没有主键的save()中进行更新

Django giving无法强制在没有主键的save()中进行更新,django,Django,我正在获取ValueError:无法在save()中强制更新,没有主键。当代码命中异常并运行get\u或\u createcode时。模型在数据库中的表具有自动增量id字段。而且这不是一个更新过程。我不明白Django为什么会这样 错误: Traceback (most recent call last): File "x.py", line 1980, in <module> getattr(a, islem)() File "x.py", line 718, in

我正在获取
ValueError:无法在save()中强制更新,没有主键。
当代码命中异常并运行
get\u或\u create
code时。模型在数据库中的表具有自动增量id字段。而且这不是一个更新过程。我不明白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.
型号:

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)
类别(models.Model):
Name=models.CharField(最大长度=155)
代码=models.CharField(最大长度=255)
ParentCategoryID=models.ForeignKey('self',related_name='SubCategory',null=True,blank=True)
级别=模型.IntegerField(默认值=0,最大长度=10,可编辑=False)
OrderID=models.IntegerField(空白=True,最大长度=10)
Slug=型号。SlugField(最大长度=250)
CreateDate=models.DateTimeField(auto\u now\u add=True)
LastUpdateDate=models.DateTimeField(auto_now=True)
Status=models.BooleanField(默认值=True)
def保存(自身、*args、**kwargs):
如果self.ParentCategoryID不是无:
parent=Categories.objects.get(id=self.parentcategoriid.id)
self.Level=父级+1

如果self.OrderID调用super时也需要使用*和**:

super(Categories, self).save(*args, **kwargs)
注意,这段代码中还有一些奇怪的东西。主要是这一行:

parent = Categories.objects.get(id=self.ParentCategoryID.id)
正在无缘无故地执行两个相同的查询
self.ParentCategoryID
已经是父对象。你应该做:

parent = self.ParentCategoryID
这将导致您得出结论,
ParentCategoryID
的名称不正确;它包含实际对象,而不是ID

还要注意,有相当多的风格冲突;Python更喜欢属性名使用带下划线的小写字母,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)
    ...

太好了,谢谢你的回答,我有时会完全失明。我很感激提供更多的信息。即使变量是类的方法/属性,也最好使用snake_case。你是对的@Jerrychayan,但项目不是我的。而且,这并不是对这个问题的评论。因为你们已经得到了解决方案,我只是试着记下一个PEP8标准,仅此而已!
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)
    ...