Django generic.GenericForeignKey()字段是否可以为空?
我正在创建一个对象,该对象跟踪有关创建、更新和删除数据库中其他所谓的Django generic.GenericForeignKey()字段是否可以为空?,django,django-models,Django,Django Models,我正在创建一个对象,该对象跟踪有关创建、更新和删除数据库中其他所谓的UUIDSyncable对象的更改(更新) 这涉及到任何扩展UUIDSyncable类的save()和delete()方法被重写的对象,其方式是创建一个新的Update对象来记录操作(插入、更新或删除),并最初创建一个models.CharField(max_length=64)字段,指定UUIDSyncable对象的UUID主键 此时,我想更新实现以使用Django的generic.GenericForeignKey()字段代
UUIDSyncable
对象的更改(更新)
这涉及到任何扩展UUIDSyncable
类的save()
和delete()
方法被重写的对象,其方式是创建一个新的Update
对象来记录操作(插入、更新或删除),并最初创建一个models.CharField(max_length=64)
字段,指定UUIDSyncable
对象的UUID主键
此时,我想更新实现以使用Django的generic.GenericForeignKey()
字段代替我的单字符字段。这将使be能够以更简单的方式访问记录更新的对象
当您希望删除一个对象并将其存储为Update
对象时,就会出现我的问题,正如您所知,Django对要删除的uuidSync
对象执行级联删除,删除所有以前的Update
记录(这是不需要的)
在我的原始实现中删除了UUIDSyncable
对象后,每个Update
对象仍将保留UUID以通知外部各方其删除。我模拟这一点的第一个解决方案是在所有Update
对象上删除对象之前设置content\u object=None
,从而防止删除级联
它表示不能将
generic.GenericForeignKey()
设置为允许NULL
值。有没有办法做到这一点,或者如果没有,如何以类似的方式使用持有UUID主键的标准CharField
和持有型号名称的sperateCharField
呢?您是否尝试过在GenericForeignKey
上设置null=True
?通用外键不是低级数据库应用程序(即MySQL、SQLite等)可以识别的概念,因此您应该能够指定字段为null
Django中数据库字段上的
null=True
表示表示表示该数据的数据库字段允许为空,而blank=True
告诉Django表单/模型验证,用户(或您,通过管理界面)可以将该字段保留为空。因此,您可能需要同时使用这两个字段来实现您的目标。也许您需要在构成通用外键的基础内容类型
和对象id
字段上设置null=True。对于惰性/实用:
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')
我已尝试允许content_type为null,但不允许object_id,因为我始终希望保留object id(本例为charField PK)的值,以供以后(即使在它指定的对象被删除之后)参考。我记得这并不是为了让我确定我的目标。我喜欢当我在谷歌上搜索并偶然发现我自己的答案时……哦
content\u type
&object\u id
是默认名称,你甚至不需要将它们设置为参数content\u object=generic.GenericForeignKey()
将是enough@yamm您必须将这些字段显式设置为blank=True/null=True,以便content\u对象可以为null,这就是问题所在。@MarkChackerian yes i know;-)这就是为什么我说您不需要将content\u-type
和object\u-id
设置为参数,因为它们是默认值。您定义content\u type
&object\u id
,然后只需执行content\u object=generic.GenericForeignKey()
@yamm--当人们依赖默认字段名而不是显式字段名时,这太烦人了。我很高兴你的建议被忽视了。