2010-02-07 18 views
7

İlk olarak, sorunun nasıl çözüleceğini biliyorum, sadece neden olduğunu anlamaya çalışıyorum. Hata mesajı:Django modelleri: Neden isim çatışıyor?

users.profile: Reverse query name for field 'address' clashes with related field 'Address.profile'. Add a related_name a rgument to the definition for 'address'.

Ve kod: Doğru, bu çizgiyi anlıyorsanız

class Address(models.Model): 
    country = fields.CountryField(default='CA') 
    province = fields.CAProvinceField() 
    city = models.CharField(max_length=80) 
    postal_code = models.CharField(max_length=6) 
    street1 = models.CharField(max_length=80) 
    street2 = models.CharField(max_length=80, blank=True, null=True) 
    street3 = models.CharField(max_length=80, blank=True, null=True) 

class Profile(Address): 
    user = models.ForeignKey(User, unique=True, related_name='profile') 
    primary_phone = models.CharField(max_length=20) 
    address = models.ForeignKey(Address, unique=True) 

:

address = models.ForeignKey(Address, unique=True) 

bir öznitelik neden olur ile Address sınıfa eklenecek adı profile. diğer "profil" adının yaratıcısı nedir?


Ters adına ihtiyacım yoksa ne olur? Devre dışı bırakmanın bir yolu var mı? Adresler bir düzine şey için kullanılır, bu yüzden ters ilişkilerin çoğu zaten boş olacaktır.

Adres alanları, adresler için ayrı bir tabloya sahip olmak yerine modele kopyalamanın bir yolu var mı? Python kalıtımı olmadan (bu bir anlam ifade etmez ve bir Modelde 2 adres varsa, işe yaramıyor).

cevap

24

django docs yılında şöyle der:

Django '+' için related_name ayarlanmış bir geriye ilişki, yaratmadı tercih ederseniz.

user = models.ForeignKey(User, related_name='+') 

ama

+0

Bunu görmedim, teşekkürler! Tuhaf sözdizimi. – mpen

+0

Bu kesinlikle devre dışı bırakmanın doğru yolu. – Exelian

+0

, https://code.djangoproject.com/ticket/5537 adresinden alındı –

1

ben serseri profile alan olacağını öğrenmek için biçiminden ... Ama bir geldiğini emin değilim: Profil, ./manage.py shell, from ... import Address geçici kaldır address = models.ForeignKey(…) sonra Address.profile söyleyecektir görmek.

ben devralma kullanmadan başka Modeli yalnızca alanları devralmak için herhangi bir resmi yolu var olduğunu düşünüyorum ... Ama yok yapabildin sahte böyle (SourceModel olduğu, örneğin Address ve TargetModel kadar, mesela, Profile) :

for field in SourceModel._meta.fields: 
    TargetModel.add_to_class(field.name, copy.deepcopy(field)) 

+0

dediğini yaptım .... kendim hiç denemedim: Örneğin, bu Kullanıcı modeli Bu modele bir geriye ilişkiyi almazsınız sağlayacaktır. 'AttributeError: 'object' nesnesinin 'profile' özelliği yoktur. Aslında ... adlandırmadan, artık bana bir hata vermiyor. Ne değiştiğimden emin değilim>. mpen

0

Ben ters adını devre dışı bırakmak mümkün olduğunu sanmıyorum (bu Django's ModelBase __new__ implementation geliyor).

Kodun üzerinden hızlı bir şekilde grep yaptım ve ilgili modelde related_name alanını ayarlamayı baypas edecek herhangi bir mantık yok gibi görünüyor.

İlgili konular