Django super class 的经理通过 ForeignKey 有不需要的 objects of child class
Django super class's manager has unwanted objects of child class via ForeignKey
class Dad(models.Model):
name = models.CharField()
def __str__(self):
return self.name
class Son(Dad):
dad = models.ForeignKey(Dad, related_name='sons')
>>> dad = Dad(name="Leonid")
>>> dad.save()
>>> Dad.objects.all()
[<Dad: Leonid>]
>>> son = Son(name='Jason')
>>> dad.sons.add(son)
>>> Dad.objects.all()
[<Dad: Leonid>, <Dad: Jason>]
>>> Son.objects.all()
[<Son: Jason>]
我不想让 Jason object 成为爸爸的经理。我不想使用自定义管理器来只过滤爸爸。有没有一种优雅的方法不包括 child class.
的 objects
您正在扩展 Dad
以创建您的 Son
模型,这在您的情况下是不正确的。当前您的代码意味着每个 Son
也是一个 Dad
。将您的 class 定义更改为:
class Son(models.Model):
您可以阅读更多关于 model inheritance and foreign key relations 的内容,这些是您似乎混淆的不同概念。
class Dad(models.Model):
name = models.CharField()
def __str__(self):
return self.name
class Son(Dad):
dad = models.ForeignKey(Dad, related_name='sons')
>>> dad = Dad(name="Leonid")
>>> dad.save()
>>> Dad.objects.all()
[<Dad: Leonid>]
>>> son = Son(name='Jason')
>>> dad.sons.add(son)
>>> Dad.objects.all()
[<Dad: Leonid>, <Dad: Jason>]
>>> Son.objects.all()
[<Son: Jason>]
我不想让 Jason object 成为爸爸的经理。我不想使用自定义管理器来只过滤爸爸。有没有一种优雅的方法不包括 child class.
的 objects您正在扩展 Dad
以创建您的 Son
模型,这在您的情况下是不正确的。当前您的代码意味着每个 Son
也是一个 Dad
。将您的 class 定义更改为:
class Son(models.Model):
您可以阅读更多关于 model inheritance and foreign key relations 的内容,这些是您似乎混淆的不同概念。