繁体   English   中英

如何从其他表中获取数据,如序列化器类 django-rest-framework 中的左连接

[英]How get data from other table like left join in serializer class django-rest-framework

我有模特

class Event(models.Model):
    main_image = models.ImageField(upload_to='events/images', default="")
    event_name = models.CharField(max_length=100, default="")
    is_active = models.BooleanField(default=True)
    is_approved = models.BooleanField(default=True)
    created_at = models.DateTimeField(default=timezone.now)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)

def __str__(self):
    return self.event_name

另一个是

class Favourite(models.Model):
    event = models.ForeignKey(
    Event, on_delete=models.CASCADE, limit_choices_to={'is_active': True}, related_name="fav_data", 
    related_query_name="fav_data")
    user_token = models.TextField(blank=True)
    is_fav = models.BooleanField(default=True)

这是一个序列化器类

class FavSerializer(serializers.ModelSerializer):
class Meta:
    model = Favourite
    fields = ['id', 'event', 'user_token', 'is_fav']

另一个是

class eventSerializer(serializers.ModelSerializer):
    additional_images = additionalImagesSerializer(many=True, read_only=True)
    fav_data = FavSerializer(many=True,read_only=True)

    class Meta:
        model = Event
        fields = ['id', 'main_image', 'event_name', 'additional_images', 'fav_data']

我的观点方法是

class eventList(ListAPIView):
    serializer_class = eventSerializer
    filter_backends = [DjangoFilterBackend,
                   filters.SearchFilter, filters.OrderingFilter]
    search_fields = ['event_name']
    filterset_fields = ['event_name']
    ordering_fields = '__all__'
    ordering = ['-id']



def get_queryset(self):
    token = self.kwargs['token']
    return Event.objects.all().filter(is_active=1, is_approved=1)

这给出了结果

{
"count": 12,
"next": "http://192.168.0.104:8000/event/allEvents/token1/?limit=10&offset=10",
"previous": null,
"results": [
    {
        "id": 16,
        "main_image": "http://192.168.0.104:8000/media/events/images/1569666693-6th-pakistan-mega-leather-show.jpg",
        "event_name": "6th Pakistan Mega leather show",
        "event_tag": [
            5,
            6,
            7
        ],
        "additional_images": [],
        "fav_data": [
            {
                "id": 6,
                "event": 16,
                "user_token": "token1",
                "is_fav": true
            },
            {
                "id": 7,
                "event": 16,
                "user_token": "token2",
                "is_fav": true
            },
            {
                "id": 8,
                "event": 16,
                "user_token": "token3",
                "is_fav": true
            },
            {
                "id": 9,
                "event": 16,
                "user_token": "token4",
                "is_fav": true
            }
        ]
    },
    {
        "id": 15,
        "main_image": "http://192.168.0.104:8000/media/events/images/1573803406-tsx-02.jpeg",
        "event_name": "The Stock Exchange",
        "event_tag": [
            8
        ],
        "additional_images": [],
        "fav_data": [
            {
                "id": 10,
                "event": 15,
                "user_token": "token1",
                "is_fav": true
            },
            {
                "id": 11,
                "event": 15,
                "user_token": "token2",
                "is_fav": true
            }
        ]
    },
 ]
}

问题是它给出了结果中的所有fav_data对象,我只想要那些在url给出fav_datauser_token 如果user_token在该event存在,它只显示相关的fav_data对象,否则它显示空的fav_data 以及如何将令牌发送到序列化程序方法并调整查询我想要这样的结果

{
"count": 12,
"next": "http://192.168.0.104:8000/event/allEvents/token1/?limit=10&offset=10",
"previous": null,
"results": [
    {
        "id": 16,
        "main_image": "http://192.168.0.104:8000/media/events/images/1569666693-6th-pakistan-mega-leather-show.jpg",
        "event_name": "6th Pakistan Mega leather show",
        "event_tag": [
            5,
            6,
            7
        ],
        "additional_images": [],
        "fav_data": [
            {
                "id": 6,
                "event": 16,
                "user_token": "token1",
                "is_fav": true
            },

        ]
    },
    {
        "id": 15,
        "main_image": "http://192.168.0.104:8000/media/events/images/1573803406-tsx-02.jpeg",
        "event_name": "The Stock Exchange",
        "event_tag": [
            8
        ],
        "additional_images": [],
        "fav_data": [
            {
                "id": 10,
                "event": 15,
                "user_token": "token1",
                "is_fav": true
            },
        ]
    },
    {
        "id": 14,
        "main_image": "http://192.168.0.104:8000/media/events/images/1573803406-tsx-02.jpeg",
        "event_name": "The Stock Exchange",
        "event_tag": [
            8
        ],
        "additional_images": [],
        "fav_data": []
    },
   ]
  }

您可以在序列化程序上下文中传递user_token

视图.py

class eventList(ListAPIView):
    ...


    def get_serializer_context(self):
        context = super(eventList, self).get_serializer_context()

        context['user_token'] = self.kwargs.get('token')
        return context

序列化程序.py

class EventSerializer(serializers.ModelSerializer):
    ...
    fav_data = serializers.SerializerMethodField()

    def get_fav_data(self, obj):
        favourites = Favourite.objects.filter(event=obj, user_token=self.context.get('user_token'))
        return FavSerializer(favourites , many=True).data

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM