Невозможно установить внешний ключ postgresql с помощью django между двумя таблицами
Пытаюсь найти лучший способ моделирования моих данных.
У меня есть одна таблица для типов покемонов:
class PokemonTypesTest2(models.Model):
name = models.CharField(max_length=25, unique=True)
У него только ID и имя, в нем будет 18 строк. Я хочу иметь возможность связать с ним несколько таблиц, например, базовую модель покемона ниже (я очистил большую часть данных, чтобы было легче следить за ними:
).class BasePokemonTest2(models.Model):
#other data hidden #
type1 = models.ForeignKey(PokemonTypesTest2, on_delete=models.CASCADE, default=1)
type2 = models.ForeignKey(PokemonTypesTest2, on_delete=models.CASCADE, default=1)
type3 = models.ForeignKey(PokemonTypesTest2, on_delete=models.CASCADE, default=1)
weaknessResistanceImmune = models.ManyToManyField(PokemonTypesTest2, through='WeakResistImmune2')
Я хочу иметь возможность связать покемона, набирающего текст, с покемоном из таблицы базовых покемонов.
Проблема в том, что я получаю эту ошибку от Django:
ERRORS:
battlefield.BasePokemonTest2.type1: (fields.E304) Reverse accessor 'PokemonTypesTest2.basepokemontest2_set' for 'battlefield.BasePokemonTest2.type1' clashes with reverse accessor for 'battlefield.BasePokemonTest2.type2'.
HINT: Add or change a related_name argument to the definition for 'battlefield.BasePokemonTest2.type1' or 'battlefield.BasePokemonTest2.type2'.
Я вижу подсказку, но не понимаю, что она означает?
related_name", то Django будет использовать имя, составленное из имени исходной модели (PokemonTypesTest2), написанного со строчной буквы и дополненного "_set". Это даст вам доступ к Manager, который возвращает все экземпляры PokemonTypesTest2, связанные с вашим экземпляром BasePokemonTest2. Например,
>>> p = BasePokemonTest2.objects.get(id=1)
>>> p.pokemontypestest2_set.all() # Returns all PokemonTypesTest2 objects related to BasePokemonTest2 instance
Django Docs: Следование отношениям "назад"
Итак, ваши назначения type1, type2 и type3 в модели BasePokemonTest2 пытаются иметь имя "basepokemontest2_set". Это недопустимо, поскольку каждое имя related_name (в одном определении модели) должно быть уникальным. Отсюда подсказка от Django, рекомендующая использовать related_name для разрешения противоречия.
Итак, чтобы работать так, как вы хотели в вашем коде выше, вам нужно что-то вроде:
type1 = models.ForeignKey(PokemonTypesTest2, on_delete=models.CASCADE, default=1, related_name="type1")
type2 = models.ForeignKey(PokemonTypesTest2, on_delete=models.CASCADE, default=1, related_name="type2")
type3 = models.ForeignKey(PokemonTypesTest2, on_delete=models.CASCADE, default=1, related_name="type3")
Однако, я не думаю, что это действительно то, чего вы хотите? Я подозреваю, что вы, вероятно, просто хотите:
type = models.ForeignKey(PokemonTypesTest2, on_delete=models.CASCADE, default=1)
(Вы также можете добавить related_name выше (установив его в любое нужное вам значение), если не хотите использовать имя _set по умолчанию)
Вы можете получить доступ ко всем PokemonTypesTest2, связанным с одним BasePokemonTest2, как указано выше.