【问题标题】:Original exception text was: 'RelatedManager' object has no attribute 'type'. - Django Rest原始异常文本是:“RelatedManager”对象没有属性“类型”。 - 姜戈休息
【发布时间】:2021-08-14 05:08:24
【问题描述】:

models.py

class Sequence(models.Model):
    category_id = models.ForeignKey(SequenceCategory, on_delete=models.CASCADE)
    description = models.TextField()
    code = models.CharField(max_length=50)
    total_divisions = models.IntegerField()
    status = models.BooleanField(default=True)

    def __str__(self):
        return self.code


class SequenceValue(models.Model):
    TYPE_CHOICES =(
        ('N', 'Numeric'),
        ('A', 'Alphabet')
    )
    sequence_id = models.ForeignKey(Sequence, on_delete=models.CASCADE, blank=True, null=True, related_name='Sequence_details')
    type = models.CharField(max_length=100, choices=TYPE_CHOICES)
    value = models.CharField(max_length=50)
    starting_value = models.CharField(max_length=50, null=True, blank=True)
    increment_value = models.CharField(max_length=50, null=True, blank=True)

    def __str__(self):
        return self.value

serializers.py

class SequenceValueSerializer(serializers.ModelSerializer):
    class Meta:
        model = SequenceValue
        # fields = '__all__'
        exclude = ['sequence_id']


class SequenceSerializer(serializers.ModelSerializer):
    Sequence_details = SequenceValueSerializer()

    class Meta:
        model = Sequence
        fields = '__all__'

    def create(self, validate_data):
        Sequence_details_data = validate_data.pop('Sequence_details')
        sequence_id = Sequence.objects.create(**validate_data)
        SequenceValue.objects.create(sequence_id=sequence_id, **Sequence_details_data)
        return sequence_id

views.py

class SequenceCreate(ListCreateAPIView):
    queryset = Sequence.objects.all()
    serializer_class = SequenceSerializer

为什么我会收到错误消息?当我参考 n 篇文章时,我得到了一个解决方案,将 many=True 放在这样的位置。

Sequence_details = SequenceValueSerializer(many=True)

但是当我对此进行更改时,我无法获取序列详细信息字段。我该如何解决这个问题?请给个解决办法好吗?

实际错误-

尝试在序列化程序 SequenceValueSerializer 上获取字段 type 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 RelatedManager 实例上的任何属性或键都不匹配。 原始异常文本是:“RelatedManager”对象没有属性“类型”。

数据传递

Data - {
    "Sequence_details": [{
        "type": "N",
        "value": "123",
        "starting_value": "1",
        "increment_value": "1"
    }],
    "description": "asd",
    "code": "qwe",
    "total_divisions": 2,
    "status": false,
    "category_id": 3
}

实际截图

【问题讨论】:

  • 你要发送什么数据到这个视图?
  • 您可以尝试使用docs.djangoproject.com/en/3.1/ref/models/fields/#default在字段上添加默认参数。
  • 好吧,数据通过了- Data - { "Sequence_details": [{ "type": "N", "value": "123", "starting_value": "1", "increment_value" : "1" }], "description": "asd", "code": "qwe", "total_divisions": 2, "status": false, "category_id": 3 }

标签: python django django-rest-framework


【解决方案1】:

添加many=True 有效,因为您的请求数据将Sequence_details 作为列表传递。为了在您的序列化程序中使用它,您只需遍历该字段并创建您的对象,如下所示:

class SequenceSerializer(serializers.ModelSerializer):
    Sequence_details = SequenceValueSerializer(many=True)

    class Meta:
        model = Sequence
        fields = '__all__'

    def create(self, validate_data):
        Sequence_details_data = validate_data.pop('Sequence_details')
        sequence_id = Sequence.objects.create(**validate_data)

        for details in Sequence_details_data
            SequenceValue.objects.create(sequence_id=sequence_id, **details)
        return sequence_id

但如果您不想这样做,您可以删除many=True 并保持您的序列化程序不变,但请确保您的请求数据中的Sequence_details 不是列表:

{
    "Sequence_details": {
        "type": "N",
        "value": "123",
        "starting_value": "1",
        "increment_value": "1"
    },
    "description": "asd",
    "code": "qwe",
    "total_divisions": 2,
    "status": false,
    "category_id": 3
}

【讨论】:

    【解决方案2】:

    我无法发表评论,所以我会在这里提一下:)。 type 实际上是 python 中的一个函数,它告诉你参数的类类型。我不确定这是否是问题,但您可以尝试将 type 重命名为 _type 或您选择的其他名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      相关资源
      最近更新 更多