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)