Как получить данные конкретного пользователя из таблицы с 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
Вернуться на верх