[英]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_data
的user_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.