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
Danke! Das war's! Ich hätte es aufgrund der Migrationsausgabe erraten können (es zeigt die Felder gequetscht ohne Unterstriche). – Ralph