【问题标题】:Django REST framework serialization error on pk fieldpk字段上的Django REST框架序列化错误
【发布时间】:2017-12-07 16:42:29
【问题描述】:

在我的 Django REST 框架项目中,我有这个模型:

class ml_request(models.Model):
    model_id = models.CharField(max_length=100)
    created = models.DateTimeField(auto_now=True)
    p_country = models.CharField(max_length=100, blank=False, default='')
    p_description = models.TextField(null=False, blank=False)
    p_designation = models.CharField(max_length=200, blank=False, default='')
    p_points = models.IntegerField(default=00)
    p_price = models.IntegerField(default=00, blank=False)
    p_province = models.CharField(max_length=100, blank=False, default='')
    p_region_1 = models.CharField(max_length=100, blank=False, default='')
    p_region_2 = models.CharField(max_length=100, blank=False, default='')
    p_variety = models.CharField(max_length=100, blank=False, default='')
    p_winery = models.CharField(max_length=100, blank=False, default='')
    owner = models.ForeignKey('auth.User', related_name='req_owner', 
on_delete=models.CASCADE)
    highlighted = models.TextField()

class Meta:
    ordering = ('created',)

然后我像这样创建我的序列化程序:

from rest_framework import serializers
from botoapi.models import ml_request, ml_response, LANGUAGE_CHOICES, 
STYLE_CHOICES, ml_logs
from django.contrib.auth.models import User

class RequestSerializer(serializers.HyperlinkedModelSerializer):

    id = serializers.IntegerField(label='ID', read_only=True)
    highlight = serializers.HyperlinkedIdentityField(view_name='request-highlight', format='html')
    owner = serializers.ReadOnlyField(source='owner.username')

    class Meta:
        model = ml_request
        fields = ('id', 'model_id', 'highlight', 'created', 'p_country', 
'p_description', 'p_designation',
              'p_points', 'p_price', 'p_province', 'p_region_1', 'p_region_2', 
'p_variety', 'p_winery', 'owner')

        def create(self, validated_data):
            log_save = ml_logs(l_verbose=validated_data, l_method="CREATE", 
             l_action=validated_data.get("model_id", None))
            log_save.save()
            return validated_data

是我的视图代码:

class RequestViewSet(viewsets.ModelViewSet):
    queryset = ml_request.objects.all()
    serializer_class = RequestSerializer
    permission_classes = (IsAuthenticatedOrReadOnly,
                      IsOwnerOrReadOnly,)

    @detail_route(renderer_classes=[renderers.StaticHTMLRenderer])
    def highlight(self, request, *args, **kwargs):
        snippet = self.get_object()
        return Response(snippet.highlighted)

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

bur 当我运行它并尝试添加值时 django 返回此错误:

/requests/ 处的 AttributeError 'dict' 对象没有属性 'pk' 请求方法:POST 请求网址:http://127.0.0.1:8000/requests/ Django 版本:1.11.7 异常类型:属性错误 异常值:
'dict' 对象没有属性 'pk'

我将 id 作为 PK,并将其添加到我的序列化程序中,有人可以帮助我想知道为什么会发生这种情况?

提前致谢

【问题讨论】:

  • 显示你的views.py
  • 好吧,我做到了。谢谢
  • 我认为您在序列化程序中的 id 定义与模型中的实际 id 字段冲突。

标签: python django serialization django-rest-framework restful-url


【解决方案1】:

从 3.x 开始,

如果要在 HyperlinkedModelSerializer 中显式添加 django auto 'id',则需要使用 ReadOnlyField(不是 IntegerField)。否则,您可以将其包含在“字段”中。

class RequestSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.ReadOnlyField()

默认情况下,序列化程序将包含一个 url 字段而不是主键字段。您可以通过将主键添加到 fields 选项来显式包含主键。

URL 字段的名称默认为“url”。你可以覆盖这个 全局,通过使用 URL_FIELD_NAME 设置。

【讨论】:

    猜你喜欢
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2015-04-03
    相关资源
    最近更新 更多