xXP*_*2Xx 0 python django angularjs django-rest-framework
我有一个应用程序,后端带有 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', )
Run Code Online (Sandbox Code Playgroud)
我的型号:
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'
Run Code Online (Sandbox Code Playgroud)
assigned_to 和assigned_by 是与 auth_user 对应的 user_id
它抛出以下错误,然后立即中断 Angular AJAX 调用,我能说的错误是“参数必须是字符串或数字\054 而不是 'dict'”
这是我第一个同时使用 Django-REST 和 Angular 的项目,我确信我遗漏了一些明显的东西。
提前致谢!
小智 5
因此,您不能在序列化程序上设置多个模型。您的序列化程序每次只能处理一个模型。另一件事,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', )
Run Code Online (Sandbox Code Playgroud)
比这更好,我建议您为 User 模型创建一个简单的序列化程序,然后使用assigned_by_name和assigned_to_name,您可以使用:
user = YourUserSerialuzer()
Run Code Online (Sandbox Code Playgroud)
但是您需要在User和ArtnetTasks模型之间建立关系才能做到这一点。您可以在此处查看有关如何执行此操作的更多示例:http : //www.django-rest-framework.org/api-guide/relations
| 归档时间: |
|
| 查看次数: |
2353 次 |
| 最近记录: |