【发布时间】:2020-08-25 12:16:01
【问题描述】:
我是 Python/Django 编程的新手,在我正在做的个人项目中遇到了一些问题。我的问题是我想根据我的应用程序的不同模型返回自定义响应,其中一些值将来自自定义查询,而其他值是模型本身的一部分。
所以,我的应用中有以下模型(删除了一些字段以使帖子不会太长):
class Parking(models.Model):
google_id = models.CharField(max_length=100)
short_name = models.CharField(max_length=100)
long_name = models.CharField(max_length=300)
price = models.DecimalField(max_digits=4, decimal_places=2, null=True, blank=True)
class ParkingLot(models.Model):
parking = models.ForeignKey(Parking, on_delete=models.CASCADE, null=False, related_name='parkinglots')
size = models.ForeignKey(Size, on_delete=models.DO_NOTHING, null=False, related_name='size')
width = models.DecimalField(max_digits=3, decimal_places=2, null=True, blank=True)
height = models.DecimalField(max_digits=3, decimal_places=2, null=True, blank=True)
class ParkingAvailability(models.Model):
parkinglot = models.ForeignKey(ParkingLot, on_delete=models.CASCADE, null=False, related_name='availability')
available = models.BooleanField(null=False, blank=False)
from_hour = models.TimeField(auto_now=False, auto_now_add=False, default='09:00:00')
to_hour = models.TimeField(auto_now=False, auto_now_add=False, default='21:00:00')
这些模型是我的数据库表的精确表示。都好。我的问题是,现在我想做一个自定义 json 响应,这需要对这些表运行查询,但不显示整个对象,在某些情况下,基于过滤器的自定义字段或我需要在表上运行的操作(对于例如,基于parking_id 和size_id 的停车场数量)。所以,让我们假设我需要一些看起来像这样的东西:
[
{
"id": 1,
"google_id": "JSDKKLAD888737283",
"short_name": "Fernandez Albano",
"long_name": "Comunidad Fernandez Albano",
"price": 18.5,
"parkinglots": 88,
"hours": {
"from_hour": "09:00:00",
"to_hour": "21:00:00",
}
}
]
前 4 个 json 值来自 Parking 模型,字段parkinglots 是带有一些过滤器(parking_id,size_id)的parkinglots 模型的.count()。可用性是来自 ParkingAvailability 模型的自定义查询,我可以通过我的 parklot_id 值访问它。
到目前为止,我有这样的东西,但在我看来这不太好:
class parkingList(APIView):
def get(self, request, format=None):
parkinglotNumber=ParkingLot.objects.filter(parking_id = 2, size_id = 1).count()
parkinglot = ParkingLot.objects.filter(parking_id = 2, size_id = 1)
hours = ParkingAvailability.objects.filter(parkinglot__in=parkinglot, available=True).aggregate(Min('from_hour'), Max('to_hour'))
content = {
'parkinglots_number': parkinglotNumber,
'hours': hours
}
return Response(content)
所以,我的问题是:
- 可以这样运行查询吗?如果想将(例如)我的停车场模型完全添加到该响应中,我需要运行另一个查询,例如“ParkingLot.objects.filter(parking_id = 2, size_id = 1)”并将其添加到我的停车响应中?
- 我的序列化程序序列化了所有模型字段,但在这种情况下我不使用它,可以在没有序列化程序类的情况下返回它吗?
- 如何构建复杂的 json 响应?就像在这种情况下,我需要从不同的模型和自定义字段向我的 json 添加不同的部分。
感谢您的帮助!对不起,我的英语不是我的母语。
PS:我的序列化程序类返回我的模型的所有信息。类的一部分是这样的:
class ParkingLotSerializer(serializers.ModelSerializer):
size = SizeSerializer(many=False, read_only=True)
availability = ParkingAvailabilitySerializer(many=True, read_only=True)
class Meta:
model = ParkingLot
fields = ['id', 'price', 'floor', 'number', 'width', 'size', 'availability']
class ParkingSerializer(serializers.ModelSerializer):
adress = AdressSerializer(many=False, read_only=True)
parkinglots = ParkingLotSerializer(many=True, read_only=True)
class Meta:
model = Parking
fields = ['id', 'google_id', 'price', 'short_name', 'long_name', 'adress', 'parkinglots' ]
【问题讨论】:
标签: json django django-models django-rest-framework django-views