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

Mar*_*row 22 django django-models

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

这涉及扩展UUIDSyncablesave()delete()方法的任何对象,以这种方式创建一个Update记录动作的新对象(插入,更新或删除),最初是一个models.CharField(max_length=64)指定对象的UUID pk的字段UUIDSyncable.

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

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

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

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

Mar*_*ian 34

对于懒惰/务实:

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')
Run Code Online (Sandbox Code Playgroud)

  • 当我谷歌并且偶然发现自己的答案时,我喜欢它 (30认同)
  • 谢谢,3行代码优于1行描述 (3认同)
  • `content_type` 和 `object_id` 是默认名称,您甚至不需要将它们设置为参数 `content_object = generic.GenericForeignKey()` 就足够了 (3认同)
  • @yamm——当人们依赖默认字段名称而不是明确显示它时,这太烦人了。我很高兴你的建议被忽略了。 (3认同)

Dan*_*man 26

也许您需要在构成通用外键的底层content_typeobject_id字段上设置null = True .