2015-12-22 4 views
8

Das ist mein Modell:Erstellen einer Beziehung eine Django abstrakte Klasse verwenden und diese Klasse vererben schafft zwei Rückwärts Beziehungen aus irgendeinem Grund

class Post(models.Model): 
    owner = models.ForeignKey(User, related_name="%(app_label)s%(class)s_set") 
    post = models.CharField(max_length=400) 

    class Meta: 
     abstract = True 


class DS(Post): 
    location = models.ForeignKey(Location, blank=True, null=True, related_name="%(app_label)s%(class)s_set") 

    class Meta(Post.Meta): 
     abstract = True 

class S(DS): 
    # same as DS 
    pass 

Nun, wenn ich Python-Shell öffnen und dies tun:

a = User.objects.get(username='a') 
dir(a) 

Dann diese beiden erscheinen:

['myapps_set', 's_set'] 

und wenn ich das tue:

a.s_set.all() 

es gibt ein S Objekt, aber wenn, wenn ich tun:

a.myapps_set.all() 

es gibt drei S Objekte (die erste S Objekt, um es zurückgibt, ist die gleiche, die zurückgegeben wurde, als ich a.s_set.all() tun. Meine zwei Fragen sind,

1) Wie kommt es, auch wenn ich speziell owner = models.ForeignKey(User, related_name="%(app_label)s%(class)s_set") tat, kann ein s_set mit einem Benutzerobjekt zugegriffen werden?

2), wie sie kommen zwei verschiedene Arten von Objekten zurückkehren (dh wie kommt myapps_set.all() kehrt 3 (die richtige Antwort) während s_set.all() nur eine gibt?

+1

welche Version von django ..? – Satyajeet

+0

@Satyajeet Django 1.8 – user2719875

Antwort

4

ich mit django == 1.8 Sie Code nur getestet habe auf und sauber virtuelle Umgebung bekam nur eine umgekehrte Beziehung

$ pip freeze 
decorator==4.0.6 
Django==1.8 
ipython==4.0.1 
ipython-genutils==0.1.0 
path.py==8.1.2 
pexpect==4.0.1 
pickleshare==0.5 
ptyprocess==0.5 
simplegeneric==0.8.1 
traitlets==4.0.0 
wheel==0.24.0 

$./manage.py shell 
In [1]: from django.contrib.auth.models import User 
In [2]: a = User.objects.all()[0] 
In [3]: [item for item in sorted(dir(a)) if 'tutu' in item or item.startswith('s') and not item.startswith('_')] 
Out[3]: 
['save', 
'save_base', 
'serializable_value', 
'set_password', 
'set_unusable_password', 
'tutus_set'] 

Hier ist der Code:. https://www.dropbox.com/s/rsej26d70swyllr/stack34406825.tar.gz?dl=0

Es sieht aus wie Sie etwas mit Ihrer lokalen Version von django getan haben oder Sie haben sh hier nicht den ganzen Code besitzen.

+0

Ah, interessant. Okay, du könntest 1) anfänglich das S-Modell erstellen, wenn es nichts erbt (stattdessen hat es seine eigene "Eigentümer" -Eigenschaft), 2) führe eine Migration durch und 3) füge dann Post und DS hinzu modellieren und 4) S von DS erben und dann eine weitere Migration durchführen? Werden sowohl s_set als auch appnames_set jetzt für dich angezeigt? Ich habe das Gefühl, das Problem tritt nur bei mir auf, weil ich vielleicht zuerst eine Migration ohne die Erbschaft gemacht habe, und ich habe es einfach vergessen. – user2719875

+0

Wenn ich das reguläre Modell in den inherent-Modus ändere, sagt der Befehl "./manage.py makemigrations app_name", dass es keine Änderungen in den Modellen gibt. Daher kann ich Ihren Anwendungsfall nicht überprüfen. –

Verwandte Themen