Задать вопрос
ValarMayar
@ValarMayar
Д У Р А Ч О К / недопрограммист графоман

Как правильно организовать связи в бд?

Есть такая модель
# Эта модель хранит всех героев , в том числе и активных, но с меткой hero_active = True
class UserAllHero(models.Model):
    user_hero = models.ForeignKey(User, on_delete=models.CASCADE)
    #hero_equip = models.OneToOneField(HeroInventory,on_delete=models.CASCADE)

    hero_name = models.CharField(default='Герой', max_length=32)
    hero_image = models.ImageField(upload_to='hero_img', default='')
    hero_life = models.IntegerField(default=20)
    hero_armour = models.IntegerField(default=20)
    hero_damage = models.IntegerField(default=120)
    hero_xp = models.IntegerField(default=0)
    hero_level = models.IntegerField(default=1)
    hero_unique_id = models.CharField(default='unique_id', max_length=48)
    hero_class = models.CharField(default='Класс', max_length=32)
    hero_badge = models.ImageField(upload_to='badge',default='')
    hero_power = models.IntegerField(default=25)
    hero_points = models.IntegerField(default=10)

    life_points = models.IntegerField(default=0)
    armour_points = models.IntegerField(default=0)
    damage_points = models.IntegerField(default=0)
    hero_active = models.BooleanField(default=False)

    weapon_one = models.OneToOneField('UserInventory.UserInvWeapon', on_delete=models.CASCADE, related_name='weapon1',blank=True,null=True)
    weapon_two = models.OneToOneField('UserInventory.UserInvWeapon', on_delete=models.CASCADE, related_name='weapon2',blank=True,null=True)
    helmet = models.OneToOneField('UserInventory.UserInvHelmet', on_delete=models.CASCADE, related_name='helm',blank=True,null=True)
    cuirass = models.OneToOneField('UserInventory.UserInvCuirass', on_delete=models.CASCADE, related_name='chest',blank=True,null=True)
    pants = models.OneToOneField('UserInventory.UserInvPants', on_delete=models.CASCADE, related_name='pant',blank=True,null=True)
    gloves = models.OneToOneField('UserInventory.UserInvGloves', on_delete=models.CASCADE, related_name='gloves',blank=True,null=True)
    boots = models.OneToOneField('UserInventory.UserInvBoots', on_delete=models.CASCADE, related_name='boot',blank=True,null=True)

    def __str__(self):
        return self.user_hero.username


В ней хранятся герои пользователя, а так же связи с предметами из других таблиц(те в данном случае типичный инвентарь как в rpg играх)

вот модель с оружием
class UserInvWeapon(models.Model):
    user_weapon = models.ForeignKey(User, on_delete=models.CASCADE)
    

    user_weapon_name = models.CharField(default='Меч', max_length=60)
    user_weapon_level = models.IntegerField(default=1)
    user_weapon_damage = models.IntegerField(default=50)
    user_weapon_inc_damage = models.IntegerField(default=10)
    user_weapon_rarity = models.CharField(default='common', max_length=32)
    user_weapon_img = models.ImageField(default='shop_sword', upload_to='shop_sword')
    user_weapon_status = models.BooleanField(default=False)
    user_weapon_unique_id = models.CharField(default='un_id', max_length=64,primary_key=True)
    user_weapon_class = models.CharField(default='класс оружия',max_length=64)


Собственно вопрос, - Как мне правильно организовать связи в данном случае? что бы каждый герой мог надевать только 1 оружие из таблицы,а если оружие надето каким-либо героем - не дать возможности надеть на другого героя.
И в дальнейшем на странице инвентаря не выводить связанные с каким-либо героем предметы.
Вроде как OneToOne сам ограничивает подобные возможности, но мне судя по всему нужно что-то вроде reverse-relationship, что бы в модели UserInvWeapon найти уже связанные с каким-либо героем

Благодарю
  • Вопрос задан
  • 32 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы