Django Model.objects.all()查询集不区分

2024-06-01 07:56:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下Django 3.0型号:

class Profile(models.Model):
    id = ShortUUIDField(primary_key=True, unique=True)
    user = models.OneToOneField(User, on_delete=models.CASCADE)

class Bounty(models.Model):
    id = ShortUUIDField(primary_key=True, unique=True)
    creator = models.ForeignKey('Profile', related_name="created_bounties", on_delete=models.SET_NULL, null=True, blank=True)
    original_completion = models.OneToOneField('ProfileTrophy', related_name="original_bounty",on_delete=models.SET_NULL, null=True, blank=True)
    name = models.CharField(max_length=50)

class ProfileTrophy(models.Model):
    id = ShortUUIDField(primary_key=True, unique=True)
    profile = models.ForeignKey('Profile', related_name="bounty_completions", on_delete=models.CASCADE)
    bounty = models.ForeignKey('Bounty', related_name="bounty_completions", on_delete=models.CASCADE)
    name = models.CharField(max_length=50, null=True, blank=True)

所以前提是有个人资料和赏金。配置文件可以创建赏金(存储为赏金上的创建者)。档案可以完成赏金,该赏金存储为档案奖杯(用于完成赏金的奖杯),他们可以完成自己创建的赏金或其他人创建的赏金(赏金可以有许多完成,但创建者创建的原始赏金存储在原始完成中)

我遇到的问题是,如果我有两个配置文件,Bob和Jim,Bob创建了一个名为“bounty 1”的赏金,并完成了它,那么一切都很好。如果Jim随后完成了“Bounty 1”,则一切正常,除了调用Bounty.objects.all()或Bob.created_bounties.all()时,我得到<QuerySet [<Bounty: Bounty 1>, <Bounty: Bounty 1>]>和queryset[0]==queryset[1]

数据库只显示了一笔赏金,所有的东西看起来都应该是这样的。如果我查看Bounty.objects.all()的查询集SQL,我会看到

SELECT "core_bounty"."id" FROM "core_bounty" LEFT OUTER JOIN "core_profiletrophy" ON ("core_bounty"."id" = "core_profiletrophy"."bounty_id")

如果我读的是右边,左边的外部连接是个问题,因为它会匹配两个ProfileTrophy,所以会返回两次赏金

关于queryset中为什么会发生这种重复以及我做错了什么有什么帮助吗

编辑:我应该补充一点,应用程序中的所有东西都运行良好,我只是注意到,因为赏金对象在管理仪表板中出现了两次,这让我非常困扰

编辑2:从赏金模型中删除创建者和原始完成对问题没有影响


Tags: namecoreidtruemodelonmodelsprofile
1条回答
网友
1楼 · 发布于 2024-06-01 07:56:19

好的,结果证明它与我遗漏的东西有关,元排序被设置为[“赏金_完成”],这导致排序需要调用左连接

相关问题 更多 >