简体   繁体   中英

django model with two fields from another model

I am creating model class Car and I want to have in it two references to one foreign key.

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

But I don't know how to make reference to field of ForeignKey already used. I get this error:

AttributeError: type object 'User' has no attribute 'email'

Is there any way to do it?

There are two things here... the first is to find out why you want to do this. Because maybe you shouldn't.

If you just want to access the owner's email address from a Car instance you don't need to add it as a field on the Car model, you can do:

my_car = Car.objects.get(owner=me)
my_email = my_car.owner.email

This does two seperate db queries, the first to get the Car and the second to get the owning User when you access the ForeignKey.

If you want to avoid this you can use select_related :

my_car = Car.objects.select_related().get(owner=me)
my_email = my_car.owner.email

Now it's only one query, Django knows to do a join in the underlying SQL.

But, assuming you know all this and you still really want to add the owner's email to the Car model. This is called 'denormalisation' and there can be valid performance reasons for doing it.

One problem that arises is how to keep the email address in sync between the User and Car models. If you are deliberately pursuing denormalisation in your Django app I highly recommend you consider using django-denorm . It installs triggers in the SQL db and provides a nice interface for specifying denormalised fields on your model.

You should really follow django's tutorial ...

You can access the user email with car_instance.owner.email .

There is no need to add existing fields to another module. You should in principle avoid repeating data. Since the email and all relevant user info exist in the user model, then the foreign key is enough to access this data in relevance to a specific car record:

car = Car.objects.first()
email = car.owner.email

You can do the same with any field of the user model.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM