我有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 个表中获取信息的最佳方法。
我重写了您的模型代码并更改了一些内容并添加了更多功能。我在用户和名为“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