首页 > 解决方案 > 如何使用 django-query 以更动态的方式获取我的 api

问题描述

模型.py

from django.db import models

class SeekerRegister(models.Model):
    seeker_name       = models.CharField(max_length=32)
    seeker_email      = models.CharField(max_length=32)

class Social(models.Model):
    social_links      = models.CharField(max_length=256)
    user              = models.ForeignKey(access_models.SeekerRegister,on_delete=models.CASCADE,related_name='social',null=True,blank=True)

我的查询:

def custom_seeker_api(request):
    obj = list(SeekerRegister.objects.values('seeker_name','seeker_email',
                                            'social__social_links','social__user',
                                            ))
    return JsonResponse(obj,safe=False)

得到:

[
  {
    "seeker_name": "soubhagya",
    "seeker_email": "soubhagya.developer@gmail.com",
    "social__social_links": "facebook.com/soubhagya",
    "social__user": 11
  },
  {
    "seeker_name": "soubhagya",
    "seeker_email": "soubhagya.developer@gmail.com",
    "social__social_links": "twitter.com/soubhagya",
    "social__user": 11
  },
  {
    "seeker_name": "soubhagya",
    "seeker_email": "soubhagya.developer@gmail.com",
    "social__social_links": "linkedin.com/soubhagya",
    "social__user": 11
  }
]

期待:

[
  {
    "seeker_name": "soubhagya",
    "seeker_email": "soubhagya.developer@gmail.com",
    "social": [
        {
            "social_links":"linkedin.com/soubhagya",
            "user": 11
        },
        {
            "social_links":"twitter.com/soubhagya",
            "user": 11
        },
        {
            "social_links":"linkedin.com/soubhagya",
            "user": 11
        }
    ]
  }
]

当我写我的查询时,我以第一种方式得到结果。意味着如果一个用户共享多个社交详细信息,那么它应该仅与同一用户一起显示在列表中

在这里,我期待我的 api 使用 django-query 的第二种方式,请查看我的代码。

标签: django

解决方案


您可以使用DRF来获得这种行为。例如:

# serializer
class SocialSerializer(serializers.ModelSerializer):
    class Meta:
        model = Social
        fields = (
            'social_links',
        )


class SeekerRegisterSerializer(serializers.ModelSerializer):
    social = serializers.SerializerMethodField()

    class Meta:
        model = SeekerRegister
        fields = (
            'id',  # inplace of user, because this data is related to SeekerRegister, not Social Model
            'social',
            'seeker_name',
            'seeker_email',
        )

    def get_social(self, obj):
        return SocialSerializer(
            obj.social.all(),
            many=True,
            read_only=True
        ).data


# view
class SocialView(APIView):
    def get(self, request):
        serializer = SeekerRegisterSerializer(SeekerRegister.objects.all(), many=True)
        return Response(serializer.data)


# url
path('/social/', SocialView.as_view())

但是如果你不想使用 DRF,那么你可以这样做:

resp_list = []
for seekreg in SeekerRegister.objects.all():
    _resp = dict()
    _resp['seeker_name'] = seekreg.seeker_name
    _resp['seeker_email'] = seekreg.seeker_email
    _resp['user'] = seekreg.id  # user info is related to SeekerRegister not Social model
    _resp['social'] = seekreg.social.values('social_links')
    resp_list.append(_resp)


return JsonResponse(resp_list,safe=False)

仅供参考:您无法直接从 django-query 获得此响应,因此您需要为此使用 for-loop。


推荐阅读