Невозможно получить доступ ко всем данным из prefetch_related, только к первому элементу массива?
У меня есть следующие три модели, которые находятся в отношениях "многие ко многим":
PokemonTypesTest
и BasePokemonTest
связаны через промежуточную таблицу WeakResistImmune
class PokemonTypesTest(models.Model):
name = models.CharField(max_length=25, unique=True)
def __str__(self):
return self.name
class BasePokemonTest(models.Model):
name = models.CharField(max_length=50, unique=True)
base_hp = models.IntegerField()
base_atk = models.IntegerField()
base_def = models.IntegerField()
base_spatk = models.IntegerField()
base_spdef = models.IntegerField()
base_speed = models.IntegerField()
type1 = models.ForeignKey(PokemonTypesTest, null=True, on_delete=models.SET_NULL, related_name='pokemontype1')
type2 = models.ForeignKey(PokemonTypesTest, null=True, on_delete=models.SET_NULL, related_name='pokemontype2')
type3 = models.ForeignKey(PokemonTypesTest, null=True, on_delete=models.SET_NULL, related_name='pokemontype3')
ability1 = models.CharField(max_length=25, default='n/a') #these abilities (ability1, ability2 and hidden_ability will need to be moved to a many-to-many table)
ability2 = models.CharField(max_length=25, default='n/a') #where a pokemon id from basepokemon table is linked to a ability id
hidden_ability = models.CharField(max_length=40, default='n/a')
pokemon_id = models.IntegerField(default=0)
weaknessResistanceImmune = models.ManyToManyField(PokemonTypesTest, through='WeakResistImmune')
class WeakResistImmune(models.Model):
#in the typing field, 1 is weakness
pokemon = models.ForeignKey(BasePokemonTest, on_delete=models.CASCADE)
weak_resist_immune = models.CharField(max_length=25)
typing = models.ForeignKey(PokemonTypesTest, on_delete=models.CASCADE)
multiplier = models.DecimalField(max_digits=5, decimal_places=2)
def __str__(self):
return str(self.pokemon.name)
Я просматривал документацию и решил, что будет работать следующее:
data = BasePokemonTest.objects.prefetch_related('weaknessResistanceImmune')
Data возвращает следующий набор запросов
<QuerySet [<BasePokemonTest: Base for - Bulbasaur>, <BasePokemonTest: Base for - Ivysaur>, <BasePokemonTest: Base for - Venusaur>, <BasePokemonTest: Base for - Mega Venusaur>, <BasePokemonTest: Base for - Charmander>]>
Я использовал предварительную выборку для поля отношения "многие ко многим" в модели BasePokemonTest.
Однако, когда я пытаюсь получить доступ к данным, я получаю ошибку-
>>> data[0]
<BasePokemonTest: Base for - Bulbasaur>
>>> data[0].weaknessResistanceImmune
<django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager object at 0x00000235D117BD30>
>>> data[0].weaknessResistanceImmune.weak_resist_immune
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'ManyRelatedManager' object has no attribute 'weak_resist_immune'
Не уверен, где я что-то напутал. Любая помощь была бы признательна!