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及以上支持这个通过ForeignKey的on_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)
Django的ForeignKey管理器有一个名为clear()的方法,它从相关的对象集中删除所有对象.首先调用,然后删除您的对象应该工作.依赖对象的外键将设置为None(如果模型中允许).
这里有一个简短的描述:http: //docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward
| 归档时间: |
|
| 查看次数: |
13892 次 |
| 最近记录: |