在Django中,有没有一种将外键设置为另一个模型的字段的方法?
例如,假设我有一个ValidationRule对象。我希望该规则定义要验证的另一个模型中的哪个字段(以及其他一些信息,例如是否可以为空,数据类型,范围等)
Django中是否有一种方法可以存储这种字段级映射?
在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 选项创建自定义中介表以保存元数据。
例如,作为外键,“Product”模型中的“categories”字段引用“Category”模型中的“name”字段,如下所示。 *请注意,“Category”模型中的被引用字段“name”需要“unique=True”或“primary_key=True”,否则会出现错误:关系所指向的相关对象上的字段。默认情况下,Django使用相关对象的主键。如果您引用不同的字段,则该字段必须具有unique=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
)
foo.foo_bar=value_bar
而不必查询 Bar。 - Sidhin S Thomas