Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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_Postgresql_Django Models_Django Orm - Fatal编程技术网

Django在删除时将外键设置为父值

Django在删除时将外键设置为父值,django,postgresql,django-models,django-orm,Django,Postgresql,Django Models,Django Orm,我有一个型号,Location,带有自引用外键。在删除位置的父项时,我想将其父项id设置为其祖父母的id,但毫不奇怪,以下抛出错误未定义名称“parent”: class Location(Model): parent = models.ForeignKey('self', models.SET(parent)) 如果我要从此表中删除Colorado: | id | name | parent_id | |----|----------|-----------| | 1 |

我有一个型号,
Location
,带有自引用外键。在删除位置的父项时,我想将其
父项id
设置为其祖父母的id,但毫不奇怪,以下抛出错误
未定义名称“parent”

class Location(Model):
    parent = models.ForeignKey('self', models.SET(parent))
如果我要从此表中删除
Colorado

| id | name     | parent_id |
|----|----------|-----------|
| 1  | USA      | NULL      |
| 2  | Canada   | NULL      |
| 3  | Colorado | 1         |
| 4  | Utah     | 1         |
| 5  | Denver   | 3         |
| 6  | Boulder  | 3         |
我希望结果如下所示:

| id | name     | parent_id |
|----|----------|-----------|
| 1  | USA      | NULL      |
| 2  | Canada   | NULL      |
| 4  | Utah     | 1         |
| 5  | Denver   | 1         |
| 6  | Boulder  | 1         |

是,预期会出现错误,
models.SET
可以接受可调用,但不接受任何参数,因此问题仍然存在,因为我们无法访问要删除的对象,您试图实现的目标可以通过信号处理:


Aamir Adnan的回答对我来说不起作用,因为在post_delete signal时刻实例已经没有id属性了(我猜)。所以我用了pre_delete

# when a category is deleted, switchs its childrens parent attr to its own parent (or None)
@receiver(pre_delete,
          sender=Category,
          dispatch_uid='delete_category')
def category_post_delete_handler(sender, instance, **kwargs):
    new_parent = instance.parent if instance.parent else None
    Category.objects.filter(parent_id=instance.id).update(parent=new_parent)
此外,我还必须设置为“删除”以不执行任何操作,这样它就不会放弃pre_delete刚才所做的更改

parent = models.ForeignKey('self',
          on_delete=models.DO_NOTHING, # handled via Category's pre_delete signal
          verbose_name=_('parent'),
          related_name='child_categories',
          blank=True,
          null=True)
parent = models.ForeignKey('self',
          on_delete=models.DO_NOTHING, # handled via Category's pre_delete signal
          verbose_name=_('parent'),
          related_name='child_categories',
          blank=True,
          null=True)