Как получить данные конкретного пользователя из таблицы с foreignKey в другую таблицу Django
У меня есть 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 - уровни для бустов, а UserBoostList - выбранные пользователем бусты. Каждый буст может иметь множество уровней от 1 до X.
Каждый пользователь должен начинать буст с уровня 1, затем с уровня 2 и далее Мне нужно проверить, какой уровень буста у каждого пользователя для каждого буста позвольте мне объяснить У меня есть буст A и буст B в таблице бустов
и повышает уровень 1,2,3 ... для каждого буста отдельно, Ex(буст A уровень 1, буст A уровень 2 и ... AND boost B level 1 , boost B level 2 and ...)
Теперь, как я могу получить информацию для имени пользователя, например, Alex, чтобы знать, какой уровень он повысил для каждого буста
Примечание: Вы можете добавить или удалить любое поле, чтобы сделать модуль лучше, если вам это нужно. но скажите мне об этом.
Я пытаюсь найти лучший способ получить информацию из 3 таблиц с foreignKey.
Я переписал код вашей модели, кое-что изменил и добавил больше функциональности. Я добавил новую связь между пользователями и списком под названием "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