gpt4 book ai didi

django - 使用 Django 抽象类创建关系并继承该类会出于某种原因创建两个反向关系

转载 作者:行者123 更新时间:2023-12-04 08:33:25 24 4
gpt4 key购买 nike

这是我的模型:

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() 只返回一个?

最佳答案

我刚刚在干净的虚拟环境中用 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 完成了某些操作,或者您并未在此处显示所有代码。

关于django - 使用 Django 抽象类创建关系并继承该类会出于某种原因创建两个反向关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34406825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com