Django при создании поста для внешнего ключа возникает ошибка 'Direct assignment to the reverse side of related set is prohibited'.
У меня есть модель Protein, которая связана с моделью Domain через внешний ключ proteins в модели Domain.
class Protein(models.Model):
protein_id = models.CharField(max_length=256, null=False, blank=False)
sequence = models.CharField(max_length=256, null=True, blank=True)
length = models.IntegerField(null=False, blank=False)
taxonomy = models.ForeignKey(Organism, blank=True, null=True, on_delete=models.DO_NOTHING)
def __str__(self):
return self.protein_id
class Domain(models.Model):
domain_id = models.CharField(max_length=256, null=False, blank=False)
description = models.CharField(max_length=256, null=False, blank=False)
start = models.IntegerField(null=False, blank=False)
stop = models.IntegerField(null=False, blank=False)
proteins = models.ForeignKey(Protein, blank=True, null=True, related_name="domains", on_delete=models.DO_NOTHING)
def __str__(self):
return self.domain_id
Я хочу разместить новую запись о белке с помощью сериализатора Protein. Сериализатор Protein отображает данные из Домена в поле domains.
class ProteinSerializer(serializers.ModelSerializer):
domains = DomainSerializer(many=True)
taxonomy = OrganismSerializer()
class Meta:
model = Protein
fields = [
'protein_id',
'sequence',
'taxonomy',
'length',
'domains',
]
Я сделал функцию create в сериализаторе Protein для создания двух внешних ключей при постинге новой записи. Однако при создании внешнего ключа для domains я получаю ошибку TypeError: Direct assignment to the reverse side of a related set is prohibited. Use domains.set() instead. Я пробовал использовать domains.set() для моего списка доменов, но это все равно дает мне ту же ошибку
def create(self, validated_data):
taxonomy_data = self.initial_data.get('taxonomy')
domains_data = self.initial_data.get('domains')
domains_list = []
for i in range(len(domains_data)):
domains_list.append(Domain.objects.filter(domain_id=domains_data[i]['domain_id']))
protein = Protein(**{**validated_data,
'taxonomy': Organism.objects.filter(taxa_id=taxonomy_data['taxa_id']).first()
})
protein.domains.set(domains_list)
protein.save()
return protein