使用Django Abstract Class创建关系并继承该类会因某种原因创建两个反向关系

时间:2015-12-22 00:49:04

标签: django inheritance django-models

这是我的模特:

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 shell并执行此操作时:

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 个答案:

答案 0 :(得分: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做了一些事情,或者你在这里没有显示所有代码。