Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django generic.GenericForeignKey()字段是否可以为空?_Django_Django Models - Fatal编程技术网

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
和持有型号名称的sperate
CharField
呢?

您是否尝试过在
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--当人们依赖默认字段名而不是显式字段名时,这太烦人了。我很高兴你的建议被忽视了。