2015-12-22 31 views
8

兩個倒退的關係這是我的模型:創建使用Django的抽象類的關係和繼承該類創建某種原因

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 

現在,當我打開Python的外殼和做到這一點:

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

那麼這兩個出現:

['myapps_set', 's_set'] 

當我做:

a.s_set.all() 

它返回一個S對象,但是當我做:

a.myapps_set.all() 

它返回三個S對象(第一S對象返回是,當我做a.s_set.all()這是返回的相同。我的兩個問題是,

1)即使我專門做了owner = models.ForeignKey(User, related_name="%(app_label)s%(class)s_set")s_set能夠通過用戶對象訪問嗎?

2)怎麼來的他們返回兩套不同的對象(即怎麼來myapps_set.all()回報3(正確答案),而s_set.all()只返回一個?

+1

哪個版本的django ..? – Satyajeet

+0

@Satyajeet Django 1.8 – user2719875

回答

4

我只是測試你的代碼和Django == 1.8上乾淨的虛擬環境,得到了只有一個反向的關係

$ 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'] 

這裏是代碼:https://www.dropbox.com/s/rsej26d70swyllr/stack34406825.tar.gz?dl=0

看起來你已經做了一些和Django的本地版本,或者您已SH並非所有代碼都在這裏。

+0

啊,有趣。好吧,你可以嘗試1)最初創建S模型,當它不從任何東西繼承(而是它有它自己的'所有者'屬性),2)做一個遷移,然後3)添加Post和DS模型和4)讓S從DS繼承,然後再做一次遷移?現在s_set和appnames_set都出現了嗎?我有一種感覺,這個問題只發生在我身上,因爲也許我最初做了沒有繼承的移植,我只是忘了它。 – user2719875

+0

當我將常規模型更改爲inhereted時,「./manage.py makemigrations app_name」命令表示模型中沒有更改。所以我不能檢查你的用例。 –