django - Django REST Framework 的嵌套 API View ?

标签 django django-rest-framework

目前我开发了以下代码,用于获取每个用户的联系人列表。这些 View 返回用户联系人的 ID 号。我需要获取所述联系人的“姓名”和“姓氏”属性,而不是 ID 号。我对 Django 的 REST 框架很陌生,不太确定下一步该做什么,但我相信我必须嵌套 APIView。我真的很感激一些帮助!

View .py

def list_contacts(request, id_profile):
    url = request.build_absolute_uri(reverse('api_users:contact_list', kwargs={'pk':id_profile}))
    response = requests.get(url)
    profile = Profile.objects.get(pk=id_profile)
    if response.status_code == status.HTTP_200_OK:
        data = response.content
        user = json.loads(data)
        return render(request, 'profiles/contact_list.html', {'user':user})

模型.py

class Profile(models.Model):
    id_user = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    birthday = models.DateField(auto_now=False)
    description = models.CharField(max_length=100)
    profile_picture = models.ImageField(upload_to='images/profiles/%Y/%m/%d', blank=False)
    active = models.BooleanField(default = False)
    contacts = models.ManyToManyField('self', blank=True, default='null')
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(default=timezone.now)
    deleted_at = models.DateTimeField(blank=True, null=True)

    class Meta:
        ordering = ('-id',)

    def __str__(self):
        return self.name+' '+self.last_name

    def active_profiles():
        return Profile.objects.filter(active=True)

api/views.py

class ContactListView(generics.ListAPIView):

queryset = Profile.objects.all()
serializer_class = UserContactListSerializer
filter_backends = (filters.SearchFilter,)
search_fields = ('name', 'last_name',)

def get(self, request, pk, format=None):
    contacts = Profile.objects.get(pk=pk)
    serializer = UserContactListSerializer(contacts)
    return Response(serializer.data)

api/serializers.py

class UserContactListSerializer(serializers.ModelSerializer):

    class Meta:
        model = Profile
        fields = ['name','last_name','contacts']

最佳答案

我不知道您的 list_contacts 中究竟发生了什么,但如果您想使用相同的序列化程序作为其本身的字段,目前还不能。
虽然 Django 模型允许您使用 'self' 作为引用,但 DRF 不允许。

您可以做的是创建另一个序列化程序并将其用作字段。

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ("id", "first_name", "last_name")

class UserContactListSerializer(serializers.ModelSerializer):
     contacts = UserSerializer(many=True)

     class Meta:
         model = Profile
         fields = ("id", "first_name", "last_name", "contacts")

关于django - Django REST Framework 的嵌套 API View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50479441/

相关文章:

django Rest框架通过查找字段而不是pk 3.4 DRF访问项目

python - Django CMS Logo 更改

python - 如何在序列化器中查找元组?

python - Django elasticsearch DSL术语和短语搜索不起作用

python - djangorest框架——如果身份验证失败,则使用下一个参数重定向到登录

django - 如何取消应用 django 1.7 中的第一次迁移

python - Django admin 在同一行显示多个字段

Django 条件 View 处理装饰器添加陈旧的 Etag

python - 没有这样的表 : auth_user error while logging to/admin/after deploy django app on pythonanywhere

python - MinValueValidator 不适用于 Django 中的 DecimalField