如何将每个用户的布尔值列表添加到django模型中?

m0rkklqb  于 2023-08-08  发布在  Go
关注(0)|答案(2)|浏览(88)

除了基本的用户模型,我在我的django应用程序中还有第二个自定义模型。这种模式被称为“挑战”。我希望这个挑战对象包含每个用户的布尔值列表,我可以在其中存储哪些用户已经完成了这个挑战。

此列表必须能够执行以下操作:

  • 每当添加新用户时,每个现有的挑战对象都需要获得一个新的布尔值,该值被设置为false。
  • 每当删除一个用户时,每个挑战中相应的布尔值也必须被删除。
  • 每当用户完成质询时,质询对象内的列表必须更新。

我该怎么做?
我想我需要使用某种ManyToOne关系的ForeignKey,但我真的不知道该怎么做。我添加了一个ManyToMany字段,并将参数User赋予它,但这只给了我一个无法删除任何用户的所有用户的列表。

roejwanj

roejwanj1#

我认为拥有布尔值列表是个坏主意,我会这样做:

class Challenge(models.Model):
   succeeded_users = models.ManyToManyField(User, verbose_name="Users who have completed this challenge"
    ...

字符串
因此,每当用户完成挑战时,您可以将他/她添加到successful_users列表:

some_challenge.succeeded_users.add(some_user)


如果要获取完成质询的所有用户:

some_challenge.succeeded_users.all()


如果你想得到所有尚未完成挑战的用户,你可以这样做,例如:

completed_uses_id = some_challenge.succeeded_users.values("ids")
uncompleted_uses = Challenge.objects.exclude(id__in=completed_uses_id )
# or 
uncompleted_uses = Challenge.objects.difference(some_challenge.succeeded_users.all())

busg9geu

busg9geu2#

您可以为质询添加一个单独的模型,在该模型中可以使用外键引用每个用户。使用on_delete=models.CASCADE在删除用户时自动删除对象。

class Challenge(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    iscomplete = models.BooleanField(default=False)

字符串
每当用户完成质询时,您都可以使用匹配的用户ID访问质询对象,并将布尔值更新为True
如果您想要有多个挑战,您可以创建一个模型来存储所有的挑战,并有一个额外的关系模型来显示哪些用户已经完成了哪些挑战。

class Challenge(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=100)

    def __str__(self):
        return f"{self.title}"

class Complete(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    challenge = models.ForeignKey(Challenge,on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.user} completed {self.challenge}"

相关问题