在Django中,有没有办法为另一个模型的字段设置外键?
例如,假设我有一个 ValidationRule 对象。 我希望规则定义要验证另一个模型中的哪些字段(以及一些其他信息,例如是否可以为空、数据类型、范围等)
有没有办法在 Django 中存储这个字段级映射?
我还没有尝试过这个,但似乎从 Django 1.0 开始你可以做类似的事情:
class Foo(models.Model):
foo = models.ForeignKey(Bar, to_field='bar')
相关文档位于此处。
是和不是。 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 选项保存元数据。
您需要在“models.ForeignKey()”中使用“to_field”来设置其他模型中的其他字段:
关联对象上的字段 是。默认情况下,Django 使用相关对象的主键。 如果您引用不同的字段,则该字段必须具有 unique=True。
例如,作为外键,“产品”模型中的“类别”字段引用“类别”模型中的“名称”字段,如下所示。 *注意,“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
)