这是我的模特:
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()
只返回一个?
答案 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做了一些事情,或者你在这里没有显示所有代码。