如何从具有foreignKey的表中获取特定用户数据到另一个表Django

问题描述 投票:0回答:1

我有3张桌子


from django.db import models
from django.contrib.auth.models import User


class Boost(models.Model):
    title = models.CharField(max_length=50,null=False)# point, storage, point p/s,
    expire = models.BooleanField(default=False)
    expireDate = models.DateTimeField(null=True)
    visiblity = models.BooleanField(default=True)

    def __str__(self):
        return "id:"+self.title

class BoostLevel(models.Model):
    id = models.AutoField(primary_key=True)
    boost = models.ForeignKey(Boost, on_delete=models.CASCADE)
    level = models.IntegerField(null=False)

    def __str__(self):
        return self.boost.title + " level: " + self.level.__str__()
    
class UserBoostList(models.Model):
    boostLevel = models.ForeignKey(BoostLevel, on_delete=models.CASCADE)
    boostId = models.ForeignKey(Boost, on_delete=models.DO_NOTHING)
    userId = models.BigIntegerField(null=False)

在我的例子中,Boost 是一个标题,Boost level 是 boost 的级别,UserBoostList 是用户选择的 boost 每个提升可以有从 1 到 X 的多个级别。

每个用户都应该从 1 级开始提升到 2 级,然后继续 我需要检查每个用户的每次提升的提升级别 让我解释 我在 Boost 表中有 Boost A 和 boost B

并且提升级别 1 ,2 ,3 ...对于每个提升单独,例如(提升 A 级别 1,提升 A 级别 2 和...并且提升 B 级别 1 ,提升 B 级别 2 和...)

现在我如何获取像 Alex 这样的用户名的信息,以了解他每次提升的级别

注意:如果需要,您可以添加或删除任何字段以使模块更好。但请告诉我这一点。

我尝试找到使用外键从 3 个表中获取信息的最佳方法。

python django module
1个回答
0
投票

我重写了您的模型代码并更改了一些内容并添加了更多功能。我在用户和名为“UserBoostList”的列表之间添加了一个新连接。这允许用户和他们的提升之间有更直接的关系,然后我将其重命名为“boostId”以避免相同的名称出现两次(冗余)。最后,我改进了模型信息的显示方式(使用 str 方法),使其更易于理解。现在看看我添加的查询功能。我希望它对你有用。 型号:

            from django.db import models
            from django.contrib.auth.models import User

            class Boost(models.Model):
                title = models.CharField(max_length=50, null=False)  # point, storage, point p/s, etc.
                expire = models.BooleanField(default=False)
                expireDate = models.DateTimeField(null=True)
                visibility = models.BooleanField(default=True)

                def __str__(self):
                    return self.title

            class BoostLevel(models.Model):
                boost = models.ForeignKey(Boost, on_delete=models.CASCADE)
                level = models.IntegerField(null=False)

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

            class UserBoostList(models.Model):
                user = models.ForeignKey(User, on_delete=models.CASCADE)  # Link directly to the user
                boostLevel = models.ForeignKey(BoostLevel, on_delete=models.CASCADE)

                def __str__(self):
                    return f"User: {self.user.username}, {self.boostLevel}"

查询:

            from django.contrib.auth.models import User
            from .models import UserBoostList

            def get_user_boost_levels(username):
                user = User.objects.get(username=username)
                user_boosts = UserBoostList.objects.filter(user=user).select_related('boostLevel__boost')
                
                boost_info = {}
                for user_boost in user_boosts:
                    boost_title = user_boost.boostLevel.boost.title
                    level = user_boost.boostLevel.level
                    boost_info[boost_title] = level
                
                return boost_info
© www.soinside.com 2019 - 2024. All rights reserved.