簡體   English   中英

Django REST-完整用戶名的自定義序列化程序

[英]Django REST - Custom Serializer for Full Username

我在后端有Django / Django-REST的應用程序,前端有Angular的應用程序。 我正在尋找將用戶ID轉換為完整用戶名以在Angular JS模式中顯示的正確方法。

這是我的序列化器:

from rest_framework import serializers
from .models import ArtnetTasks
from django.contrib.auth.models import User


class TaskSerializer(serializers.ModelSerializer):
    date_assigned = serializers.DateTimeField(format='%Y-%m-%d')
    assigned_by_name = serializers.SerializerMethodField('full_username')
    assigned_to_name = serializers.SerializerMethodField('full_username')

    def full_username(self, id):

        user = User.objects.get(id=id)
        name = user.first_name + " " + user.last_name
        return name

    class Meta:
        model = ArtnetTasks, Users
        fields = ('id', 'headline', 'message', 'assigned_to', 'assigned_to_name', 'assigned_by', 'assigned_by_name', 'date_assigned', )

我的模特:

class ArtnetTasks(models.Model):
    id = models.IntegerField(primary_key=True)
    headline = models.CharField(max_length=75L)
    message = models.TextField()
    response_message = models.TextField(blank=True)
    assigned_to = models.IntegerField(null=True, blank=True)
    assigned_by = models.IntegerField(null=True, blank=True)
    date_assigned = models.DateTimeField()
    date_completed = models.DateTimeField(null=True, blank=True)
    is_active = models.IntegerField(null=True, blank=True)
    date_updated = models.DateTimeField(null=True, blank=True)
    class Meta:
        db_table = 'artnet_tasks'

Assigned_to和Assigned_by是與auth_user對應的user_id

它引發以下錯誤,然后立即中斷對Angular AJAX的調用,從我可以看出的錯誤是“參數必須是字符串或數字\\ 054而不是'dict'”

這是我的第一個同時使用Django-REST和Angular的項目,並且可以肯定我缺少明顯的東西。

提前致謝!

因此,您不能在序列化器上設置多個模型。 您的序列化器每次只能處理一個模型。 另一件事, SerializerMethodField具有參數selfobj ,其中obj是您的ArtnetTasks實例。 作為更好的RESTful做法,如果您的用戶已通過身份驗證,我建議您使用以下示例:

class TaskSerializer(serializers.ModelSerializer):
    date_assigned = serializers.DateTimeField(format='%Y-%m-%d')
    assigned_by_name = serializers.SerializerMethodField('get_user_full_name')
    assigned_to_name = serializers.SerializerMethodField('get_user_full_name')

    def get_user_full_name(self, obj):
        request = self.context['request']
        user = request.user
        name = user.first_name + " " + user.last_name
        return name

    class Meta:
        model = ArtnetTasks
        fields = ('id', 'headline', 'message', 'assigned_to', 'assigned_to_name',      'assigned_by', 'assigned_by_name', 'date_assigned', )

更好的是,我建議您為User模型創建一個簡單的序列化器,然后使用,而不要使用Assigned_by_nameAssigned_to_name

 user = YourUserSerialuzer()

但是您需要在UserArtnetTasks模型之間建立關系。 您可以在此處查看有關此操作的更多示例: http : //www.django-rest-framework.org/api-guide/relations

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM