Как создать функцию для проверки атрибута другого поля в отдельной модели?
class Trait(models.Model):
name = models.CharField(max_length=20)
animal_types = models.ManyToManyField(AnimalType)
# slots = models.CharField(default=None, null=True, max_length=4)
#slots is meant to hold a value that determines where it can be placed in animal model
#i.e. null means anywhere, "2" means only trait 2
#def TraitPlace(self):
def __str__(self):
return self.name
#need to add animal details like age and gender to a separate model or integrate/hardcode into animal model as they're only 7 options
class ANIMAL(models.Model):
animal_type = models.ForeignKey(AnimalType, on_delete = models.CASCADE)
first_trait = models.ForeignKey(Trait, on_delete = models.CASCADE)
#first trait and animal required as animals always exist and have at least one trait
# second_trait= models.ForeignKey(Trait, on_delete = models.CASCADE)
# third_trait= models.ForeignKey(Trait, on_delete=models.CASCADE)
У меня есть модель животного, которая используется для создания животного с 3 признаками, проблема в том, что некоторые признаки имеют определенные ограничения на размещение, например, "lithe" может быть только в позиции 3, а glistening может быть только в позициях 2 и 3. Было предложено добавить дополнительное поле "слоты" под моделью признака.
Я понимаю логически, как это должно работать, но испытываю трудности с реализацией. Я пытался найти документацию и использовать hasattr под моим first_trait, но это не сработало или я просто не правильно разместил. По сути, я пытаюсь сделать так, чтобы при вызове модели Animal и добавлении человеком второго признака, она проверяла атрибут "slots" в базе данных, чтобы убедиться, что позиция "признака" действительна. Так что если slots был "1,2" или "2,3", они были бы ограничены только первой и второй, и второй и третьей позициями, соответственно. Я потратил много часов, пытаясь заставить это работать, но не смог этого сделать, надеюсь, что кто-то из вас, легенды Интернета, сможет мне помочь или направить меня в правильном направлении. Спасибо.
вы можете попробовать добавить класс модели для проверки данных перед вставкой/обновлением в Animals & Traits
class AnimalTraits(models.Model):
trait_name = models.ForeignKey(Trait)
animal_type = models.ForeignKey(ANIMAL)
slots = models.CharField(default=None, null=True, max_length=4)
sql-запрос для выяснения того, какие слоты действительны для некоторого введенного пользователем животного & trait будет выглядеть примерно так
SELECT at.slots from AnimalTrait at, ANIMAL a, Trait t
WHERE at.animal_type = a.animal_type
AND at.trait_name = t.name
AND a.animal_type = `$user_input_animal_type`
AND t.name = `$user_input_trait`;
& вы можете добавить некоторую бизнес-логику, чтобы определить, находится ли слот ввода пользователя в этом возвращаемом значении. Приятно то, что это также можно использовать для определения того, действителен ли признак для животного