Есть такая модель
# Эта модель хранит всех героев , в том числе и активных, но с меткой 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 найти уже связанные с каким-либо героем
Благодарю