[英]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具有參數self和obj ,其中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_name和Assigned_to_name :
user = YourUserSerialuzer()
但是您需要在User和ArtnetTasks模型之間建立關系。 您可以在此處查看有關此操作的更多示例: http : //www.django-rest-framework.org/api-guide/relations
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.