【问题标题】:Django REST - Custom Serializer for Full UsernameDjango REST - 完整用户名的自定义序列化程序
【发布时间】:2014-02-09 22:33:49
【问题描述】:

我有一个后端有 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 的项目,我确信我遗漏了一些明显的东西。

提前致谢!

【问题讨论】:

    标签: python django angularjs django-rest-framework


    【解决方案1】:

    因此,您不能在序列化程序上设置多个模型。您的序列化程序每次只能处理一个模型。另一件事,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

    【讨论】:

      猜你喜欢
      • 2018-12-10
      • 2016-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2019-10-07
      • 2020-08-04
      • 1970-01-01
      相关资源
      最近更新 更多