Как создать функцию для проверки атрибута другого поля в отдельной модели?

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`;

& вы можете добавить некоторую бизнес-логику, чтобы определить, находится ли слот ввода пользователя в этом возвращаемом значении. Приятно то, что это также можно использовать для определения того, действителен ли признак для животного

Вернуться на верх