我正在创建模型类 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' has no attribute 'email'
有什么办法吗?
请您参考如下方法:
这里有两件事...第一是找出你为什么要这样做。因为也许你不应该。
如果您只想从 Car 实例访问所有者的电子邮件地址,则不需要将其添加为 Car 模型的字段,您可以这样做:
my_car = Car.objects.get(owner=me)
my_email = my_car.owner.email
这会执行两个单独的数据库查询,第一个是获取 Car,第二个是在您访问 ForeignKey 时获取所属的 User。
如果你想避免这种情况,你可以使用 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 数据库中安装触发器,并提供一个很好的接口(interface)来指定模型上的非规范化字段。
