不需要引用完整性的Django ForeignKey?

2024-06-08 13:39:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在django模型中设置一个ForeignKey字段,该字段有时指向另一个表。但我希望可以在这个字段中插入一个id,它引用另一个表中可能不存在的条目。因此,如果行存在于另一个表中,我希望获得ForeignKey关系的所有好处。但如果不是,我希望这只是一个数字。

这可能吗?这就是泛型关系的意义吗?


Tags: django模型id关系条目数字泛型意义
3条回答

这可能与声明FOREIGN KEY和创建列而不实际将其声明为外键一样简单。这样,您将得到o.obj嫒u id,如果对象存在,o.obj将工作,并且——我认为——如果您尝试加载一个实际上不存在的对象(可能是DoesNotExist),将引发一个异常。

但是,我认为没有任何方法可以让syncdb为您这样做。我发现syncdb被限制到无用的程度,所以我完全绕过它,用自己的代码创建模式。您可以使用syncdb创建数据库,然后直接更改表,例如ALTER TABLE tablename DROP CONSTRAINT fk_constraint_name

当然,在DELETE CASCADE和所有引用完整性检查中也会丢失。

我是新来的Django,所以我现在不知道它是否提供了你想要的东西。我想到了这样的事情:

from django.db import models

class YourModel(models.Model):
    my_fk = models.PositiveIntegerField()

    def set_fk_obj(self, obj):
        my_fk = obj.id

    def get_fk_obj(self):
        if my_fk == None:
            return None
        try:
            obj = YourFkModel.objects.get(pk = self.my_fk)
            return obj
        except YourFkModel.DoesNotExist:
            return None

我不知道你是否使用了contrib管理应用程序。使用PositiveIntegerField而不是ForeignKey,该字段将在管理站点上用文本字段呈现。

很久以前就有人问过这个问题,但对于新手来说,现在有一种内置的方法可以通过在外键上设置db_constraint=False来处理这个问题:

https://docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.ForeignKey.db_constraint

customer = models.ForeignKey('Customer', db_constraint=False)

或者,如果希望可以为空并且不强制引用完整性:

customer = models.ForeignKey('Customer', null=True, blank=True, db_constraint=False) 

如果我们不能保证以正确的顺序建立关系,我们就使用这个方法。

编辑:更新链接

相关问题 更多 >