2016-12-29 19 views
0

So mache ich Django-Modelle Country und Embassy, eine Botschaft erfordert zwei Länder beteiligt sein, ein Land, das die Botschaft darstellt, und ein anderes, das die Botschaft befindet. So ich habe zwei Hier ist meine models.py in EmbassyCountry s als Fremdschlüssel setzen:Django Modell hat keine Fremdschlüsselobjekt

from django.db import models 

class Country(models.Model): 
    code = models.CharField(primary_key=True, max_length=3) #ISO Alpha-3 Country Code 
    name = models.CharField(max_length=50, db_column="Name") 

    def __str__(self): 
     return self.name 


class Embassy(models.Model): 
    government = models.ForeignKey(Country, on_delete=models.CASCADE, related_name="government") 
    location = models.ForeignKey(Country, on_delete=models.CASCADE, related_name="location") 
    name = models.CharField(max_length=200, db_column="Name") 
    street_address = models.CharField(max_length=200, db_column="Address") 
    city = models.CharField(max_length=50, db_column="City") 
    phone_number = models.IntegerField(default=-1, db_column="Phone Number") 
    fax_number = models.IntegerField(null=True, blank=True, db_column="Fax Number") 
    email_address = models.CharField(max_length=200, db_column="Email") 
    website = models.CharField(max_length=200, db_column="Link") 

    def __str__(self): 
     return self.name 

wenn ich jetzt in die Schale gehen möchte ich finden, was Botschaften mit einem Land verbunden sind:

>>> from appName.models import Country, Embassy 
>>> c = Country(code="USA", name="United States of America") 
>>> c.save() 
>>> Country.objects.all() 
<QuerySet [<Country: United States of America>]> 
>>> c.embassy_set.all() 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
AttributeError: 'Country' object has no attribute 'embassy_set' 

Wenn schauen über das django tutorial mit dem Choice Modell, das einen Fremdschlüssel des Modells Question hat, haben die Frageobjekte ein Attribut, das eine Gruppe von Auswahlobjekten ist (q.choice_set.all() gibt ein QuerySet zurück). Meine Country Objekte haben jedoch kein Embassy Objekt als Attribut festgelegt. Warum passiert dies? Wie kann ich das beheben?

Antwort

2

Dies ist, weil Sie bereits eine related_name angegeben haben, wo Sie das Country Modell referenziert haben. Auch Country wird durch zwei Felder im Modell Embassy referenziert. Mit ähnlichen Namen, können Sie tun:

c.government.all() 

Dadurch kehren alle Embassy auf die das Land c die Regierung ist.

c.location.all() 

Werden alle Embassy zurück, die in dem Land c befinden.

Referenz: Backward relationships

Verwandte Themen