Django 按计数和分组
我想计算Django 按计数和分组,django,django-rest-framework,Django,Django Rest Framework,我想计算车号字段中的记录数,按国家分组 我的模特 class country(models.Model): country_name = models.CharField(max_length=50, blank=True, default="none") volgorde = models.PositiveIntegerField(blank=True, null=True) def __str__(self): return self.country_
车号
字段中的记录数,按国家分组
我的模特
class country(models.Model):
country_name = models.CharField(max_length=50, blank=True, default="none")
volgorde = models.PositiveIntegerField(blank=True, null=True)
def __str__(self):
return self.country_name
class car(models.Model):
car_number = models.CharField(verbose_name='VIN',max_length=11,unique=True,blank=False ,validators=[numeric])
car_country = models.ForeignKey('country', verbose_name='Country',blank=True, null=True, default=1, on_delete=models.PROTECT)
def __str__(self):
return (self.car_number)
def get_absolute_url(self):
return reverse("car:list", kwargs={"id":self.id})
class Meta:
ordering = ["-car_number"]
我的观点
class CarViewSet(viewsets.ModelViewSet):
queryset = car.objects.only('car_country').select_related('car_country')
serializer_class = CarSerializer
class CountrySerializer(serializers.ModelSerializer):
class Meta:
model = country
fields = ('country_name',)
class CarSerializer(serializers.ModelSerializer):
car_country = CountrySerializer()
class Meta:
model = car
fields = ('car_number','car_country',)
我现在得到的结果如下:
[
{
"car_number": "45678",
"car_country": {
"country_name": "Europe/UK"
}
},
{
"car_number": "3333333",
"car_country": {
"country_name": "Europe / Netherlands"
}
},
{
"car_number": "11111111111",
"car_country": {
"country_name": "Europe/UK"
}
}
]
你的类名应该以大写字母开头
要返回包含相关车号数量的国家/地区列表,请首先向您的车型添加以下内容:
class Car(models.Model):
car_number = models.CharField(verbose_name='VIN',max_length=11,unique=True,blank=False ,validators=[numeric])
car_country = models.ForeignKey('Country', verbose_name='Country',blank=True, null=True, default=1, on_delete=models.PROTECT, related_name='cars')
from django.db.models import Count
class CarViewSet(viewsets.ModelViewSet):
queryset = Country.objects.all().annotate(car_amount=Count('cars')).order_by('-car_amount')
serializer_class = CountrySerializer
class CountrySerializer(serializers.ModelSerializer):
count_cars = serializers.SerializerMethodField(read_only=True)
def get_count_cars(model):
return model.cars.all().count()
class Meta:
model = Country
fields = ('country_name' 'count_cars',)
然后,您可以在视图中的查询中使用and,如下所示:
class Car(models.Model):
car_number = models.CharField(verbose_name='VIN',max_length=11,unique=True,blank=False ,validators=[numeric])
car_country = models.ForeignKey('Country', verbose_name='Country',blank=True, null=True, default=1, on_delete=models.PROTECT, related_name='cars')
from django.db.models import Count
class CarViewSet(viewsets.ModelViewSet):
queryset = Country.objects.all().annotate(car_amount=Count('cars')).order_by('-car_amount')
serializer_class = CountrySerializer
class CountrySerializer(serializers.ModelSerializer):
count_cars = serializers.SerializerMethodField(read_only=True)
def get_count_cars(model):
return model.cars.all().count()
class Meta:
model = Country
fields = ('country_name' 'count_cars',)
为了获得正确的输出,我们使用a获取特定国家的汽车
对象的计数,如下所示:
class Car(models.Model):
car_number = models.CharField(verbose_name='VIN',max_length=11,unique=True,blank=False ,validators=[numeric])
car_country = models.ForeignKey('Country', verbose_name='Country',blank=True, null=True, default=1, on_delete=models.PROTECT, related_name='cars')
from django.db.models import Count
class CarViewSet(viewsets.ModelViewSet):
queryset = Country.objects.all().annotate(car_amount=Count('cars')).order_by('-car_amount')
serializer_class = CountrySerializer
class CountrySerializer(serializers.ModelSerializer):
count_cars = serializers.SerializerMethodField(read_only=True)
def get_count_cars(model):
return model.cars.all().count()
class Meta:
model = Country
fields = ('country_name' 'count_cars',)
输出应如下所示:
[
{
"country_name": "Europe/UK",
"count_cars": 10
},
{
"country_name": "Netherlands",
"count_cars": 6
},
{
"country_name": "Belgium",
"count_cars": 3
},
]
如果希望输出升序而不是降序,请从订单中删除-
。\u by()
根据车辆数量降序排列:
Country.objects.all().annotation(car\u amount=Count('cars')).order\u by('-car\u amount')
基于车辆数量的升序:
Country.objects.all().annotation(car\u amount=Count('cars')).order\u by('car\u amount')
你的类名应该以大写字母开头
要返回包含相关车号数量的国家/地区列表,请首先向您的车型添加以下内容:
class Car(models.Model):
car_number = models.CharField(verbose_name='VIN',max_length=11,unique=True,blank=False ,validators=[numeric])
car_country = models.ForeignKey('Country', verbose_name='Country',blank=True, null=True, default=1, on_delete=models.PROTECT, related_name='cars')
from django.db.models import Count
class CarViewSet(viewsets.ModelViewSet):
queryset = Country.objects.all().annotate(car_amount=Count('cars')).order_by('-car_amount')
serializer_class = CountrySerializer
class CountrySerializer(serializers.ModelSerializer):
count_cars = serializers.SerializerMethodField(read_only=True)
def get_count_cars(model):
return model.cars.all().count()
class Meta:
model = Country
fields = ('country_name' 'count_cars',)
然后,您可以在视图中的查询中使用and,如下所示:
class Car(models.Model):
car_number = models.CharField(verbose_name='VIN',max_length=11,unique=True,blank=False ,validators=[numeric])
car_country = models.ForeignKey('Country', verbose_name='Country',blank=True, null=True, default=1, on_delete=models.PROTECT, related_name='cars')
from django.db.models import Count
class CarViewSet(viewsets.ModelViewSet):
queryset = Country.objects.all().annotate(car_amount=Count('cars')).order_by('-car_amount')
serializer_class = CountrySerializer
class CountrySerializer(serializers.ModelSerializer):
count_cars = serializers.SerializerMethodField(read_only=True)
def get_count_cars(model):
return model.cars.all().count()
class Meta:
model = Country
fields = ('country_name' 'count_cars',)
为了获得正确的输出,我们使用a获取特定国家的汽车
对象的计数,如下所示:
class Car(models.Model):
car_number = models.CharField(verbose_name='VIN',max_length=11,unique=True,blank=False ,validators=[numeric])
car_country = models.ForeignKey('Country', verbose_name='Country',blank=True, null=True, default=1, on_delete=models.PROTECT, related_name='cars')
from django.db.models import Count
class CarViewSet(viewsets.ModelViewSet):
queryset = Country.objects.all().annotate(car_amount=Count('cars')).order_by('-car_amount')
serializer_class = CountrySerializer
class CountrySerializer(serializers.ModelSerializer):
count_cars = serializers.SerializerMethodField(read_only=True)
def get_count_cars(model):
return model.cars.all().count()
class Meta:
model = Country
fields = ('country_name' 'count_cars',)
输出应如下所示:
[
{
"country_name": "Europe/UK",
"count_cars": 10
},
{
"country_name": "Netherlands",
"count_cars": 6
},
{
"country_name": "Belgium",
"count_cars": 3
},
]
如果希望输出升序而不是降序,请从订单中删除-
。\u by()
根据车辆数量降序排列:
Country.objects.all().annotation(car\u amount=Count('cars')).order\u by('-car\u amount')
基于车辆数量的升序:
Country.objects.all().annotation(car\u amount=Count('cars')).order\u by('car\u amount')
您的车型是什么样子的?您好,我添加了车型谢谢。我真的不确定你想要的输出是什么。你想精确计算哪些字段?我修改了我的问题。结果应该是一个国家(按顺序)和(计数)车号的列表。请参阅我的更新答案您的车型是什么样子的?嗨,Stevy,我添加了车型谢谢。我真的不确定你想要的输出是什么。你想精确计算哪些字段?我修改了我的问题。结果应该是一个国家列表(按顺序排列)和(计数)汽车号码。请参阅我的更新答案