Я определяю сериализаторы моделей для POST экземпляра задачи в Django REST.
Мои модели:
class Task(models.Model):
"""
Model instance represents basic info about calculations doing in Celery worker.
"""
id = models.AutoField(primary_key=True)
name = models.CharField(blank=True, max_length=100)
description = models.CharField(blank=True, max_length=300)
class Vector(models.Model):
"""
Model instance represents geometry file (*.SHP) saved in FileSystem.
"""
id = models.AutoField(primary_key=True)
name = models.CharField()
file_path = models.CharField()
class CalculateVector(models.Model):
"""
Model instance represents neccessary info for call Celery worker task.
It contains 1:M relation between Vector and CalculateVector.
"""
id = models.AutoField(primary_key=True)
task_id = models.ForeignKey(Task, related_name='calculate_vectors', on_delete=models.CASCADE)
method = models.CharField()
vector = models.ForeignKey(Vector, models.SET_NULL, related_name='vector')
поэтому каждый экземпляр CalculateVector содержит информацию только об одном экземпляре модели Vector, но модель Vector может содержать несколько экземпляров CalculateVector.
и мои сериализаторы:
class VectorSerializer(serializers.ModelSerializer):
id = serializers.IntegerField()
class Meta:
model = Vector
fields = (
'id',
'name'
)
class CalculateVectorSerializer(serializers.ModelSerializer):
vector = VectorSerializer()
class Meta:
model = CalculateVector
fields = (
'id',
'method',
'vector'
)
class CreateTaskSerializer(serializers.ModelSerializer):
calculate_vectors = CalculateVectorSerializer()
class Meta:
model = Task
fields = (
'id',
'name',
'description',
'calculate_vectors'
)
def create(self, validated_data):
calculate_vector_data = validated_data.pop('calculate_vectors')
instance = Task.objects.create(**validated_data)
vector = Vector.objects.get(id=calculate_vector_data.get('vector')['id'])
CalculateVector.objects.update_or_create(
task_id=instance,
method=calculate_vector_data['method'],
vector=vector,
)
return instance
при попытке запросить этот сериализатор я получил сообщение об ошибке:
>>> data = {'name':'test task','description':'description','calculate_vectors':{'vector':{'id':1,'name':'calc1'},'method':'method1'}}
>>> serializer = CreateTaskSerializer(data=data)
>>> serializer.is_valid()
>>> serializer.save()
>>> serializer.data
AttributeError: Got AttributeError when attempting to get a value for field `vector` on serializer `CalculateVectorSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `RelatedManager` instance.
Original exception text was: 'RelatedManager' object has no attribute 'vector'.
Почему я не могу использовать serializer.data
переменную? И как я могу это исправить? Любая помощь?