我正在创建一个对象,该对象跟踪有关创建,更新和删除数据库中其他所谓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
?
答案 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_type
和object_id
字段上设置null = True。
答案 2 :(得分:0)
Daniel Roseman所说的很好。只需确保更新数据库以允许在这些字段上使用Null,因为您可能在没有设置的情况下创建了表。
答案 3 :(得分:-3)
您是否尝试在null=True
上设置GenericForeignKey
?通用外键不是低级数据库应用程序(即MySQL,SQLite等)可识别的概念,因此您应该能够指定该字段为空。
null=True
表示表示该数据的数据库字段允许为空,而blank=True
告诉Django表单/模型验证字段可以由用户(或者您通过管理界面)保留为空。因此,您可能需要同时使用它们来实现您所追求的目标。