Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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自定义保存方法中访问数据库对象?_Django_Database_Postgresql_Heroku - Fatal编程技术网

如何在django自定义保存方法中访问数据库对象?

如何在django自定义保存方法中访问数据库对象?,django,database,postgresql,heroku,Django,Database,Postgresql,Heroku,我必须检查django模型保存方法是否用于创建新对象或更新它,因为如果更新了,我必须从父对象更新子对象的状态 class Categoria(Entidad): ESTADO = (("Activo", "Activo"), ("Inactivo", "Inactivo")) estado = models.CharField(verbose_name=_("Estado"), max_length=20, choices=ESTADO, default=1) categoria_

我必须检查django模型保存方法是否用于创建新对象或更新它,因为如果更新了,我必须从父对象更新子对象的状态

class Categoria(Entidad):

  ESTADO = (("Activo", "Activo"), ("Inactivo", "Inactivo"))
  estado = models.CharField(verbose_name=_("Estado"), max_length=20, choices=ESTADO, default=1)
  categoria_padre = models.ForeignKey('self', verbose_name=_("Categoría Padre"), related_name='parent_category', related_query_name='child_category', null=True, blank=True, on_delete=models.CASCADE)

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

    from django.db import connection

    # first option does not work because i can access to django model manager
    old = self.objects.get(id=self.id)

    # second option throughs 500 error when create new objects
    cursor = connection.cursor()
    response = cursor.execute("SELECT * FROM cms_categoria WHERE id = '" + str(self.id) + "'")
    set = response.fetchall()
    connection.commit()
    cursor.close()
    connection.close()
第二种选择适用于当地的发展,但在将其推给拥有博士后学位的heroku时则不起作用

有人能帮我吗?
谢谢,您好。

您应该能够显著简化
save()
方法,据我所知,无需导入连接和使用游标

如果在save方法中需要检查数据库中是否已经存在实例,则可以执行以下操作:

def save(self, *args, **kwargs):
    if self.pk:
        # update your child objects here if it has been updated
        pass
    return super.save(*args, **kwargs)
这是因为如果在DB中创建对象(即新实例),则在调用
super().save(*args,**kwargs)
之前,不会为其分配主键。如果主键存在,您知道它正在更新,而不是创建。

。相反如果你收到的信中没有一个能解决你的问题,你也可以接受它。