我是 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 模型的自定义查询,我可以通过我的 parkinglot_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' ]