generic.GenericForeignKey()字段可以为Null吗?

时间:2010-03-01 16:09:03

标签: django django-models

我正在创建一个对象,该对象跟踪有关创建,更新和删除数据库中其他所谓UUIDSyncable个对象的更改(更新)。

这涉及扩展UUIDSyncable类的save()delete()方法被覆盖的任何对象,以便创建一个记录该操作的新Update对象(插入,更新或删除)和最初的models.CharField(max_length=64)字段,指定UUIDSyncable个对象的UUID pk。

此时我想更新实现以使用Django的generic.GenericForeignKey()字段而不是我的单个字符字段。这将使得能够以更简单的方式访问正在记录更新的对象。

当您希望删除对象并将其存储为Update对象时,我的问题就出现了,因为您知道Django会对要删除的UUIDSyncable对象执行级联删除,删除所有先前的Update 1}}记录(不需要)。

当我的原始实现中删除了UUIDSyncable对象时,每个Update对象仍将保留UUID以通知外部方删除它。我的第一个模拟这个的解决方案是在删除所有content_object = None对象上的对象之前设置Update,从而防止删除级联。

无法将generic.GenericForeignKey()设置为允许NULL值的接缝。有没有办法做到这一点,或者如果没有办法如何以类似的方式使用持有UUID主键的标准CharField和持有模型名称的sperate CharField

4 个答案:

答案 0 :(得分:32)

懒惰/务实:

class MyModel(models.Model):
    ...other fields...
    content_type = models.ForeignKey(ContentType, blank=True, null=True, on_delete=models.SET_NULL)
    object_id = models.PositiveIntegerField(blank=True, null=True)
    content_object = generic.GenericForeignKey('content_type', 'object_id')

答案 1 :(得分:26)

也许您需要在构成通用外键的基础content_typeobject_id字段上设置null = True。

答案 2 :(得分:0)

Daniel Roseman所说的很好。只需确保更新数据库以允许在这些字段上使用Null,因为您可能在没有设置的情况下创建了表。

答案 3 :(得分:-3)

您是否尝试在null=True上设置GenericForeignKey?通用外键不是低级数据库应用程序(即MySQL,SQLite等)可识别的概念,因此您应该能够指定该字段为空。

Django中数据库字段的

null=True表示表示该数据的数据库字段允许为空,而blank=True告诉Django表单/模型验证字段可以由用户(或者您通过管理界面)保留为空。因此,您可能需要同时使用它们来实现您所追求的目标。