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

问题描述 投票:0回答:3

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

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

有没有办法在 Django 中存储这个字段级映射?

python python-3.x django django-models foreign-keys
3个回答
108
投票

我还没有尝试过这个,但似乎从 Django 1.0 开始你可以做类似的事情:

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

相关文档位于此处


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。

例如,作为外键,“产品”模型中的“类别”字段引用“类别”模型中的“名称”字段,如下所示。 *注意,“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 )
    
© www.soinside.com 2019 - 2024. All rights reserved.