Django模型如何将外键设置为另一个模型的字段

38

在Django中,有没有一种将外键设置为另一个模型的字段的方法?

例如,假设我有一个ValidationRule对象。我希望该规则定义要验证的另一个模型中的哪个字段(以及其他一些信息,例如是否可以为空,数据类型,范围等)

Django中是否有一种方法可以存储这种字段级映射?

3个回答

108

我没有尝试过这个,但似乎自Django 1.0以来,你可以做类似这样的事情:

class Foo(models.Model):
    foo = models.ForeignKey(Bar, to_field='bar')

有关此内容的文档在这里


3
正是我在寻找的。我希望这也意味着我可以执行 foo.foo_bar=value_bar 而不必查询 Bar。 - Sidhin S Thomas
2
在2017年,使用Django 2.0正好解决了我的问题。谢谢。 - Zach King
2
理想情况下,引用的字段应该在整个表中是唯一的,可以是主键或设置为“unique”参数的字段。 - ankit tyagi

18

是的,也不是。在类级别上描述了FK关系,并镜像了数据库中的FK关联,因此您不能直接在FK参数中添加额外信息。

相反,我建议使用一个字符串来保存另一张表中的字段名:

class ValidationRule(models.Model):
    other = models.ForeignKey(OtherModel)
    other_field = models.CharField(max_length=256)

通过这种方式,您可以使用以下代码获取字段:

v = ValidationRule.objects.get(id=1)
field = getattr(v, v.other_field)

请注意,如果您使用的是多对多字段(而不是一对多),则内置支持使用 through 选项创建自定义中介表以保存元数据。


2
您需要在“models.ForeignKey()”中使用“to_field”来设置其他模型中的字段:

ForeignKey.to_field

关系所指向的相关对象上的字段。默认情况下,Django使用相关对象的主键。如果您引用不同的字段,则该字段必须具有unique=True。

例如,作为外键,“Product”模型中的“categories”字段引用“Category”模型中的“name”字段,如下所示。 *请注意,“Category”模型中的被引用字段“name”需要“unique=True”或“primary_key=True”,否则会出现错误:
# "models.py"

from django.db import models
                                            # "unique=True" or
class Category(models.Model):               # "primary_key=True" are needed 
    name = models.CharField(max_length=100, unique=True)
    
class Product(models.Model):
    name = models.CharField(max_length=100)                
    categories = models.ForeignKey(
        Category, 
        to_field='name', # ← Here
        on_delete=models.PROTECT
    )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接