Python 如何在查询集中获得一对多的相似结果 如何在查询集中实现一对多的相似结果。
我正在执行一个查询,返回与结帐日期匹配的结果。是否可以修改结果以返回一个ref_id下的房间数组,其中ref_id和结帐日期匹配Python 如何在查询集中获得一对多的相似结果 如何在查询集中实现一对多的相似结果。,python,django,django-rest-framework,orm,Python,Django,Django Rest Framework,Orm,我正在执行一个查询,返回与结帐日期匹配的结果。是否可以修改结果以返回一个ref_id下的房间数组,其中ref_id和结帐日期匹配 # models.py class Booking(models.Model): ref_id = models.TextField(null=True) room = models.ForeignKey(Room, on_delete=models.SET_NULL, null=True) check_in_date = models.Dat
# models.py
class Booking(models.Model):
ref_id = models.TextField(null=True)
room = models.ForeignKey(Room, on_delete=models.SET_NULL, null=True)
check_in_date = models.DateField(blank=False, null=False)
check_out_date = models.DateField(blank=False, null=False)
# serializer.py
class RoomSerializer(serializers.ModelSerializer):
class Meta:
model = Room
fields = ('id', 'room_number',)
class BookingsSerializer(serializers.Serializer):
ref_id = serializers.CharField()
room = serializers.ListField(child=RoomSerializer())
# room = RoomSerializer(many=True)
check_out_date = serializers.DateField()
# views.py
class ReadBookings(APIView):
filter = {}
filter['check_out_date']=check_out_date
bookings = Booking.objects.filter(**filter)
serializer = BookingsSerializer(bookings,many=True)
return Response(serializer.data)
enter code here
返回结果
期望结果
我认为这是一个可能的解决办法。您可以使用
serializers.SerializerMethodField()
从具有相同ref\u id
和签出日期的所有预订中获取所有房间
class BookingsSerializer(serializers.Serializer):
ref_id = serializers.CharField()
rooms = serializers.SerializerMethodField()
check_out_date = serializers.DateField()
def get_rooms(self, obj):
rooms = []
bookings = Booking.objects.select_related('room')\
.filter(ref_id=obj.ref_id, check_out_date=obj.check_out_date)
for booking in bookings:
room = booking.room
rooms.append({"room_id": room.room_id, "room_number": room.room_number})
return rooms
我确实从中得到了灵感。get_房间也可以简化为一行,如;def get_rooms(self,obj):返回预订。对象。预回迁相关(“房间”)。过滤器(ref_id=obj.ref_id)\.值(“房间编号”,“房间预订状态”)
[
{
id: 1
ref_id: "o6eWRjURKP-e4c6d0ca96a145419f528db1a9994029-1609055850117"
check_out_date: "2020-12-29"
rooms:[
{
id: 8
room_number: "006"
},
{
id: 9
room_number: "007"
}
]
},
{
.........
.....
}
]
class BookingsSerializer(serializers.Serializer):
ref_id = serializers.CharField()
rooms = serializers.SerializerMethodField()
check_out_date = serializers.DateField()
def get_rooms(self, obj):
rooms = []
bookings = Booking.objects.select_related('room')\
.filter(ref_id=obj.ref_id, check_out_date=obj.check_out_date)
for booking in bookings:
room = booking.room
rooms.append({"room_id": room.room_id, "room_number": room.room_number})
return rooms
bookings_list = [
{
"id": 1,
"ref_id": "o6eWRjURKP-e4c6d0ca96a145419f528db1a9994029-1609055850117",
"check_out_date": "2020-12-29",
"room":{
"id": 8,
"room_number": "006"
},
},
{
"id": 2,
"ref_id": "o6eWRjURKP-e4c6d0ca96a145419f528db1a9994029-1609055850117",
"check_out_date_id": "2020-12-29",
"room":{
"id": 9,
"room_number": "007"
}
}
]
from collections import defaultdict
# check out dates are all the same
check_out_date = bookings_list[0]['check_out_date']
rooms_by_ref_id = defaultdict(list)
# sort rooms lists by ref_id
for b in bookings_list: rooms_by_ref_id[b['ref_id']].append(b['room'])
# populate wanted object
bookings_grouped_rooms_by_ref_id = [
{'check_out_date': check_out_date, 'ref_id': k, 'rooms': v}
for k,v in rooms_by_ref_id.items()
]