Django создает пост с внешним ключом обратной связи
У меня есть модель 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, который отображает Queryset следующим образом:
domains = DomainSerializer(many=True)
taxonomy = OrganismSerializer()
class Meta:
model = Protein
fields = [
'protein_id',
'sequence',
'taxonomy',
'length',
'domains',
]
Проблема возникает, когда мне нужно создать новую запись Protein с помощью сериализатора Protein. Я пишу функцию post API для создания новой записи, но она выдает ошибки при попытке создать поля внешнего ключа.
@api_view(['POST'])
def protein(request):
if request.method == 'POST':
serializer = ProteinSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Я добавил следующую функцию в свой сериализатор Protein, чтобы переопределить функцию создания для двух внешних ключей, но она, похоже, не работает при попытке создания для отношения domains. Она сообщает мне, что я могу использовать только целые числа для индекса domain_data вместо того, чтобы использовать domain_id для индекса, но она прекрасно работает для данных таксономии
TypeError: индексы списка должны быть целыми числами или срезами, а не str
def create(self, validated_data):
taxonomy_data = self.initial_data.get('taxonomy')
domains_data = self.initial_data.get('domains')
protein = Protein(**{**validated_data,
'taxonomy': Organism.objects.filter(taxa_id=taxonomy_data['taxa_id']),
'domains': Domain.objects.filter(domain_id=domains_data['domain_id'])
})
protein.save()
return protein
Это связано с тем, что внешний ключ домена не существует в модели Protein или это неправильный способ выполнения функции создания? Кто-нибудь может дать совет по этому поводу?