我正在创建模型类Car,我希望在其中有两个对一个外键的引用。
class Car(models.Model):
owner = models.ForeignKey(User)
#and here I want to have owner email (which is already set in class User)
email = owner.email
但我不知道如何引用已经使用过的ForeignKey字段。 我收到这个错误:
AttributeError:type object' User'没有属性'电子邮件'
有什么办法吗?
答案 0 :(得分:5)
这里有两件事......首先是找出你想要这样做的原因。因为也许你不应该这样做。
如果您只想从Car
实例访问所有者的电子邮件地址,则无需将其添加为Car
模型上的字段,您可以执行以下操作:
my_car = Car.objects.get(owner=me)
my_email = my_car.owner.email
这会执行两个单独的数据库查询,第一个获取Car
,第二个获取拥有User
时访问ForeignKey。
如果您想避免这种情况,可以使用select_related
:
my_car = Car.objects.select_related().get(owner=me)
my_email = my_car.owner.email
现在它只有一个查询,Django知道在底层SQL中进行连接。
但是,假设您知道这一切,并且您仍然希望将所有者的电子邮件添加到Car
模型中。这称为'denormalisation',这可能是有效的性能原因。
出现的一个问题是如何在User
和Car
型号之间保持电子邮件地址同步。如果您故意在Django应用程序中进行非规范化,我强烈建议您考虑使用django-denorm。它在SQL db中安装触发器,并提供了一个很好的接口,用于在模型上指定非规范化字段。
答案 1 :(得分:1)
你应该真的关注django's tutorial ...
您可以使用car_instance.owner.email
访问用户电子邮件。
答案 2 :(得分:1)
无需将现有字段添加到其他模块。原则上应避免重复数据。由于电子邮件和所有相关的用户信息都存在于用户模型中,因此外键足以访问与特定汽车记录相关的数据:
car = Car.objects.first()
email = car.owner.email
您可以对用户模型的任何字段执行相同操作。