我有两个型号。我需要让属性 c 引用属性 y 。
class One
x = models.AutoField(primary_key=True)
y = models.IntegerField(max_length=5)
class Two
a = models.AutoField(primary_key=True)
b = models.ForeignKey(One)
c = models.ForeignKey(One, related_name='y')
以上语法给出以下错误:
CommandError:一个或多个模型未验证:
二:字段'c'的访问者与字段'One.c'发生冲突。将related_name参数添加到'c'的定义中
二:字段'c'的反向查询名称与字段'One.c'发生冲突。将related_name参数添加到'c'的定义中。
答案 0 :(得分:1)
请尝试ForeignKey.to_field
之类的:
class One
x = models.AutoField(primary_key=True)
y = models.IntegerField(max_length=5)
class Two
a = models.AutoField(primary_key=True)
b = models.ForeignKey(One)
c = models.ForeignKey(One, related_name='y', to_field = 'y')
并告诉我它是否有帮助。
请告诉你需要什么,因为它看起来不是一个好的(cannonical)解决方案:)
答案 1 :(得分:1)
我认为你没有理由这样做。如果您对模型“One”有引用,则可以轻松访问属性“y”
from your_app.models import One, Two
two = Two.objects.get(pk=1) # To get the first Object, for example
one = two.b # You get a Objects of Model One
print one.y # Print the attribute 'y' from models One
(我希望里面没有语法错误。如果有的话,纠正我)
这样您就可以访问所需的属性。无需引用无主键字段。事实上,我认为甚至不可能引用一个没有主键的字段。引用是1:1关系。如果该字段不是主键,那么可能是具有相同conent的更多字段:
A: ID_pk Text B: ID_pk text_fk
1 Foo 1 1
2 Bar 2 Foo
3 Foo
也许这个例子解释了问题。表A存储由primary_key ID_pk标识的Text。 表B参考表A.在第1行中没有问题。我们要引用的ID是1.所以它是表A中的第1行。 在第2行,我们只说'Foo'。但由于表A中的Foo位于第1行和第3行,因此数据库不知道您要引用哪一行