如何在Django 1.5.2中创建一个不是主键的属性的ForeginKey?

时间:2013-11-20 06:48:21

标签: django django-models

我有两个型号。我需要让属性 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'的定义中。

2 个答案:

答案 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行,因此数据库不知道您要引用哪一行