如何使用ForeignKeys创建一个Django模型,该模型不会删除其子项的删除?

And*_*rov 23 mysql django django-models

我的其中一个模型ForeignKey实际上是其他表上的MySQL视图.我遇到的问题是,当我从这些表中删除数据时,Django,如"删除对象"文档中所述 ......

当Django删除一个对象时,它会模拟SQL约束ON DELETE CASCADE的行为 - 换句话说,任何具有指向要删除的对象的外键的对象都将随之删除.

...尝试从我的视图中删除行,当然它不能,因此抛出错误:

mysql_exceptions.OperationalError '>=(1395, "Can not delete from join view 'my_db.my_mysql_view'"'
Run Code Online (Sandbox Code Playgroud)

有没有办法ForeignKey在模型上指定约束,它将为我提供所有Django魔法,但是不会将删除级联到它上面?或者,有没有办法让MySQL忽略从我的视图中删除行而不是引发错误的命令?

Ned*_*der 23

Django 1.3a1及以上支持这个通过ForeignKeyon_delete论点.

以下示例NULL在删除外键时设置字段.有关更多选项,请参阅文档.

user = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)
Run Code Online (Sandbox Code Playgroud)


Rod*_*ius 18

哈罗德的回答指出了我正确的方向.这是我实现它的方式草图(在法国遗留数据库上,因此有点奇怪的命名约定):

class Factures(models.Model):
    idFacture = models.IntegerField(primary_key=True)
    idLettrage = models.ForeignKey('Lettrage', db_column='idLettrage', null=True, blank=True)

class Paiements(models.Model):
    idPaiement = models.IntegerField(primary_key=True)
    idLettrage = models.ForeignKey('Lettrage', db_column='idLettrage', null=True, blank=True)

class Lettrage(models.Model):
    idLettrage = models.IntegerField(primary_key=True)

    def delete(self):
        """Dettaches factures and paiements from current lettre before deleting"""
        self.factures_set.clear()
        self.paiements_set.clear()
        super(Lettrage, self).delete()
Run Code Online (Sandbox Code Playgroud)

  • 请参阅`on_delete = models.SET_NULL`:https://docs.djangoproject.com/en/1.4/ref/models/fields/#foreignkey(sinze 1.3 version) (2认同)
  • 为什么`SET_NULL`有帮助?`更新将外键设置为NULL的视图仍会引发异常.`models.DO_NOTHING`虽然有帮助. (2认同)

Har*_*old 7

Django的ForeignKey管理器有一个名为clear()的方法,它从相关的对象集中删除所有对象.首先调用,然后删除您的对象应该工作.依赖对象的外键将设置为None(如果模型中允许).

这里有一个简短的描述:http: //docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward