Задать вопрос
@Lepilov

DRF: как исправить ошибку вложенной сериализации?

Я создаю страницу, на которой перечислены все существующие поставщики (Vendors) и модули, которые применяются к каждому поставщику. Здесь мне нужно изменить статус модулей (делать их активными или неактивными), и если модуль не существует, но нужно сделать его активным, то создавать его. Это выглядит примерно так.

Vendor1   module1/false  module2/true   module3/true .....
Vendor2   module1/false  module2/true   module3/true .....
.....
.....


models.py

class RfiParticipation(models.Model):
    vendor = models.ForeignKey('Vendors', models.DO_NOTHING, related_name='to_vendor')
    m = models.ForeignKey('Modules', models.DO_NOTHING, related_name='to_modules')
    active = models.BooleanField(default=False)
    user_id = models.IntegerField()
    rfi = models.ForeignKey('Rfis', models.DO_NOTHING, related_name='to_rfi', blank=True, null=True)
    timestamp = models.DateTimeField(auto_now=True)


Для отображения я использую класс ListCreateAPIView и вложенный сериализатор

serializer.py

class VendorModulesListManagementSerializer(serializers.ModelSerializer):
    to_vendor = RfiParticipationSerializer(many=True)

    class Meta:
        model = Vendors
        fields = ('vendorid', 'vendor_name', 'to_vendor',)
        read_only_fields = ('vendorid', 'vendor_name', )

    def create(self, validated_data):
        validated_data = validated_data.pop('to_vendor')
        for validated_data in validated_data:
            module, created = RfiParticipation.objects.update_or_create(
                rfi=validated_data.get('rfi', None),
                vendor=validated_data.get('vendor', None),
                m=validated_data.get('m', None),
                defaults={'active': validated_data.get('active', False)})
        return module


class RfiParticipationSerializer(serializers.ModelSerializer):

    class Meta:
        model = RfiParticipation
        fields = ('pk', 'active', 'm', 'rfi', 'vendor', 'timestamp')
        read_only_fields = ('timestamp', )


views.py

class AssociateModulesWithVendorView(generics.ListCreateAPIView):
    """
    RFI: List of vendors with participated modules and modules status
    """
    permission_classes = [permissions.AllowAny, ]
    serializer_class = VendorModulesListManagementSerializer
    queryset = Vendors.objects.all()


Формат входных данных выглядит так
data = {
    "to_vendor": [
            {
                "active": false,
                "m": 1,
                "rfi": "20R1",
                "vendor": 15

            }]
}


Но в итоге получаю ошибку
AttributeError: Got AttributeError when attempting to get a value for field `to_vendor` on serializer `VendorModulesListManagementSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `RfiParticipation` instance.
Original exception text was: 'RfiParticipation' object has no attribute 'to_vendor'.
  • Вопрос задан
  • 184 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы