简体   繁体   English

Django rest 框架,在序列化程序中创建用户字段时出错

[英]Django rest framework, error when creating user field in serializer

I have an API that didn't contain a created by user field.我有一个 API 不包含由用户创建的字段。

I decided to add such field in the serializer:我决定在序列化程序中添加这样的字段:

class PointsSerializer(PermissionRequiredMixin, HyperlinkedModelSerializer):
    date_added = DateTimeField(format="%d-%m-%Y", required=False, read_only=True)
    created_by = serializers.CharField(default=CurrentUserDefault(),)

    class Meta:
        model = Points
        fields = (
            'created_by', 'MissionName', 'location_name', 'GDT1Latitude', 'GDT1Longitude',
            'UavLatitude', 'UavLongitude', 'UavElevation', 'Area',
            'date_added'
        )

until now my logic in the view worked fine, after migrating to this changes I started getting this error in the view when trying to serialize data and use it:到目前为止,我在视图中的逻辑运行良好,在迁移到此更改后,我在尝试序列化数据并使用它时开始在视图中收到此错误:

class PointsViewSet(ModelViewSet):
    # Return all order by id, reversed.
    queryset = Points.objects.all().order_by('-id')
    serializer_class = PointsSerializer
    data = queryset[0]
    serialized_data = PointsSerializer(data, many=False)
    pprint(serialized_data)
    points = list(serialized_data.data.values())

    search_fields = ['MissionName', 'date_added']
    ordering_fields = ['id', 'MissionName', 'Area', 'date_added']
    filter_backends = (filters.SearchFilter, filters.OrderingFilter)

    @action(detail=True, methods=["post"])
    def last_object_by_user(self, request, *args, **kwargs):
        # your query to get the last object by your user
        queryset = Points.objects.filter(created_by=request.user).latest()
        return queryset

    def retrieve(self, request, *args, **kwargs):
        """
        Main Triangulation Logic.
        This method takes in all the parameters posted by the user and returns the mission generated map.
        :rtype: Mission File Object 
        """
        mission_name = self.points[1]
        mission_reference = f'{DIR}/{mission_name}.{HTML}'

        assign_gdt = GeoPoint(lat=self.points[2], long=self.points[3])
        gdt1 = [assign_gdt.get_lat(), assign_gdt.get_long()]

        assign_uav = GeoPoint(lat=self.points[4], long=self.points[5], elevation=self.points[6])
        uav = [assign_uav.get_lat(), assign_uav.get_long(), assign_uav.get_elevation()]

        area_name = f"'{self.points[-3]}'".capitalize()

        if not request.user.is_authenticated:
            return HTTP_401_UNAUTHORIZED
        try:

            return render(request, mission_reference), print("Mission file already existed")
        except:
            main = MainApp.run(gdt1=gdt1, uav=uav, mission_name=mission_name, area=area_name)
            return render(request, main), print('New mission file was created')

the error being raised on point variable:点变量引发的错误:

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/rest_framework/fields.py", line 454, in get_attribute
    return get_attribute(instance, self.source_attrs)
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/rest_framework/fields.py", line 94, in get_attribute
    instance = getattr(instance, attr)
AttributeError: 'Points' object has no attribute 'created_by'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/django/utils/autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/django/core/management/commands/runserver.py", line 117, in inner_run
    self.check(display_num_errors=True)
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/django/core/management/base.py", line 395, in check
    include_deployment_checks=include_deployment_checks,
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/django/core/management/base.py", line 382, in _run_checks
    return checks.run_checks(**kwargs)
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/django/core/checks/registry.py", line 72, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/django/core/checks/urls.py", line 13, in check_url_config
    return check_resolver(resolver)
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/django/core/checks/urls.py", line 23, in check_resolver
    return check_method()
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/django/urls/resolvers.py", line 407, in check
    for pattern in self.url_patterns:
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/django/utils/functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/django/urls/resolvers.py", line 588, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/django/utils/functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/django/urls/resolvers.py", line 581, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/yovel/PycharmProjects/Triangulation/triangulationapi/triangulationapi/urls.py", line 25, in <module>
    path('', include('find_second_gdt.urls')),
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/django/urls/conf.py", line 34, in include
    urlconf_module = import_module(urlconf_module)
  File "/usr/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/yovel/PycharmProjects/Triangulation/triangulationapi/find_second_gdt/urls.py", line 4, in <module>
    from .views import PointsViewSet
  File "/home/yovel/PycharmProjects/Triangulation/triangulationapi/find_second_gdt/views.py", line 18, in <module>
    class PointsViewSet(ModelViewSet):
  File "/home/yovel/PycharmProjects/Triangulation/triangulationapi/find_second_gdt/views.py", line 24, in PointsViewSet
    points = list(serialized_data.data.values())
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/rest_framework/serializers.py", line 562, in data
    ret = super().data
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/rest_framework/serializers.py", line 260, in data
    self._data = self.to_representation(self.instance)
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/rest_framework/serializers.py", line 516, in to_representation
    attribute = field.get_attribute(instance)
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/rest_framework/fields.py", line 469, in get_attribute
    return self.get_default()
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/rest_framework/fields.py", line 513, in get_default
    return self.default(self)
  File "/home/yovel/PycharmProjects/Triangulation/ven/lib/python3.7/site-packages/rest_framework/fields.py", line 287, in __call__
    return serializer_field.context['request'].user
KeyError: 'request'

Remove the following class members from PointsViewSet .PointsViewSet中删除以下 class 成员。 Your serializer now requires the request in the context when instantiating it, but this can't supply it as it gets run when the class is imported.现在,您的序列化程序在实例化它时需要上下文中的请求,但是当它在导入 class 时运行时,它无法提供它。

data = queryset[0]
serialized_data = PointsSerializer(data, many=False)
pprint(serialized_data)
points = list(serialized_data.data.values())

as @ schilling stated, what I didn't understand is that I should return points in a method.正如@schilling 所说,我不明白的是我应该在一个方法中返回点。

So, This is the new view:所以,这是新的观点:

class PointsViewSet(ModelViewSet):
    # Return all order by id, reversed.
    def get_queryset(self):
        queryset = Points.objects.all().order_by('-id')
        return queryset

    def get_serializer_class(self):
        return PointsSerializer

    search_fields = ['MissionName', 'date_added']
    ordering_fields = ['id', 'MissionName', 'Area', 'date_added']
    filter_backends = (filters.SearchFilter, filters.OrderingFilter)

    def get_object(self):
        queryset = self.get_queryset()
        data = queryset[0]
        serialized_data = PointsSerializer(data, many=False)
        points = list(serialized_data.data.values())
        return points

    @action(detail=True, methods=["post"])
    def last_object_by_user(self, request, *args, **kwargs):

        queryset = Points.objects.filter(created_by=request.user).latest()
        return queryset

    # @action(detail=True, methods=["post"])
    def retrieve(self, request, *args, **kwargs):
        """
        Main Triangulation Logic.
        This method takes in all the parameters posted by the user and returns the mission generated map.
        :rtype: Mission File Object
        """
        points = self.get_object()
        mission_name = points[1]
        mission_reference = f'{DIR}/{mission_name}.{HTML}'

        assign_gdt = GeoPoint(lat=points[2], long=points[3])
        gdt1 = [assign_gdt.get_lat(), assign_gdt.get_long()]

        assign_uav = GeoPoint(lat=points[4], long=points[5], elevation=points[6])
        uav = [assign_uav.get_lat(), assign_uav.get_long(), assign_uav.get_elevation()]

        area_name = f"'{points[-3]}'".capitalize()

        if not request.user.is_authenticated:
            return HTTP_401_UNAUTHORIZED
        try:

            return render(request, mission_reference), print("Mission file already existed")
        except:
            main = MainApp.run(gdt1=gdt1, uav=uav, mission_name=mission_name, area=area_name)
            return render(request, main), print('New mission file was created')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 实例化时Django REST框架序列化器错误 - Django REST framework serializer error when instantiating 在 django rest 框架中创建 object 时,将用户数据传递给嵌套序列化程序中的序列化程序 - pass user data to serializer in nested serializers when creating object in django rest framework 序列化程序 - Django REST 框架(AttributeError:在尝试获取序列化程序上的字段 `user` 的值时出现 AttributeError) - Serializers - Django REST framework (AttributeError: Got AttributeError when attempting to get a value for field `user` on serializer) 使用Django Rest框架创建对象时将数据更新到序列化器 - Update data to serializer when creating object with django rest framework Django REST Framework:尝试获取序列化器上字段的值时发生AttributeError - Django REST Framework: AttributeError when attempting to get a value for field on serializer 将计数字段添加到django rest框架序列化程序 - Add a count field to a django rest framework serializer Django Rest Framework序列化器字段样式参数 - Django Rest Framework serializer field style argument Django Rest Framework 序列化器字段命名不正确 - Django Rest Framework serializer field incorrectly named Django Rest Framework中的get_FIELD_serializer - get_FIELD_serializer in Django Rest Framework django rest框架中Serializer中OneToOne Field的问题 - Issues with OneToOne Field in Serializer in django rest framework
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM