2017-09-27 4 views
0

Ich habe eine Klasse B, die eine ForeignKey-Beziehung zu Klasse A enthält. Wenn ich B instanziieren kann ich Feld 'a' zugreifen, aber die umgekehrte Beziehung (die automatisch erstellt werden soll) löst einen Fehler aus. Konkret habe ich die folgenden Klassendefinitionen:Django Fremdschlüssel Rückwärtsbeziehung funktioniert nicht

from django.db.models import Model, CharField, DateField, ForeignKey 
from django.urls import reverse 

class Patient(Model): 

    GENDER = (
     ('M', 'Male'), 
     ('F', 'Female'), 
     ('U', 'Unknown'), 
    ) 

    last_name = CharField(max_length=128, null=False) 
    first_name = CharField(max_length=128, null=False, default='') 
    gender = CharField(max_length=1, choices=GENDER, null=False) 
    dob = DateField(null=False) 

    def get_absolute_url(self): 
     return reverse('patient_detail', args=[str(self.id)]) 

    def __str__(self): 
     return '{}, {} ({}, {})'.format(self.last_name, self.first_name, self.gender, self.dob) 


class AttributeSet(Model): 

    name = CharField(max_length=128, null=False) 
    description = CharField(max_length=256, blank=True, default='') 

    def get_absolute_url(self): 
     return reverse('attribute_set_detail', args=[str(self.id)]) 

    def __str__(self): 
     return self.name 


class AttributeSetInstance(Model): 

    patient = ForeignKey('Patient', null=False) # Automatic 'attribute_set_instance_set' backward relation? 
    attribute_set = ForeignKey('AttributeSet', null=False) 

    def get_absolute_url(self): 
     return reverse('attribute_set_instance_detail', args=[str(self.id)]) 

    def __str__(self): 
     return self.attribute_set.name 

Wenn ich versuche, einen neuen AttributeSetInstance mit einem Patienten und AttributeSet Argument zu schaffen, ich die Patienten und attribute_set Felder zugreifen können, aber nicht umgekehrt. Wie so:

Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 12:39:47) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 
>>> from app.models import Patient, AttributeSet, AttributeSetInstance 
>>> p = Patient(last_name='Doe', first_name='John', gender='M', dob='1973-07-16') 
>>> p 
<Patient: Doe, John (M, 1973-07-16)> 
>>> a = AttributeSet(name='Set1') 
>>> a 
<AttributeSet: Set1> 
>>> i = AttributeSetInstance(patient=p, attribute_set=a) 
>>> i 
<AttributeSetInstance: Set1> 
>>> i.patient 
<Patient: Doe, John (M, 1973-07-16)> 
>>> i.attribute_set 
<AttributeSet: Set1> 
>>> p.attribute_set_instance_set 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
AttributeError: 'Patient' object has no attribute 'attribute_set_instance_set' 
>>> 

So i.patient funktioniert, aber p.attribute_set_instance_set nicht. Soweit ich herausfinden konnte, fügt der Standardmanager, der den ForeignKey-Beziehungen zugewiesen ist, ein '_set'-Postfix an die Rückwärtsbeziehung an.

Irgendeine Idee, was ich falsch mache? Es wäre eine große Hilfe. Es ist wahrscheinlich etwas albern ...

Ralph

Antwort

1

Sie haben unterstreicht hinzugefügt, wo es nicht sein sollte. Der standardmäßige verwandte Name ist der Kleinbuchstabe des Modells plus _set, also für AttributeSetInstance ist es attributesetinstance_set.

Wenn Sie Ihre Unterstreichungsversion verwenden möchten, können Sie sie als explizites related_name-Argument für das ForeignKey-Feld festlegen.

+0

Danke! Das war's! Ich hätte es aufgrund der Migrationsausgabe erraten können (es zeigt die Felder gequetscht ohne Unterstriche). – Ralph