Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何获取父序列化程序中的子级总数_Django_Django Rest Framework_Django Serializer - Fatal编程技术网

Django 如何获取父序列化程序中的子级总数

Django 如何获取父序列化程序中的子级总数,django,django-rest-framework,django-serializer,Django,Django Rest Framework,Django Serializer,我想在父(票证计数器)序列化程序中显示与票证计数器关联的工人总数 以下是两个序列化程序: class TicketCounterSerializer(serializers.ModelSerializer): workers = WorkerToCounterSerializer(many=True, read_only=True) class Meta: model = TicketCounter fields = ( 'ticke

我想在父(票证计数器)序列化程序中显示与票证计数器关联的工人总数

以下是两个序列化程序:

class TicketCounterSerializer(serializers.ModelSerializer):
 workers = WorkerToCounterSerializer(many=True, read_only=True)    
 class Meta:
     model = TicketCounter
     fields = (
               'ticket_counter_name',
               'ticket_counter_description',
               'ticket_counter_address',
               'workers',
               )


class WorkerToCounterSerializer(serializers.ModelSerializer):
 class Meta:
     model = WorkerToTicketCounter
     fields = (
         'user',
         'ticket_counter',
         'worker',
     )
型号:

class TicketCounter(models.Model):
   user = models.ForeignKey(User, on_delete=models.CASCADE)
   ticket_counter_name = models.CharField(max_length=100, default="")
   ticket_counter_description = models.CharField(max_length=1500, default="")
   ticket_counter_address = models.CharField(max_length=1500, default="")


class WorkerToTicketCounter(models.Model):
   user = models.ForeignKey(User, on_delete=models.CASCADE)
   ticket_counter = models.ForeignKey(TicketCounter,related_name="workers")
   worker = models.ForeignKey(User,related_name='worker_for_ticket_counter')
以下是我获得结果的方式:

{
        "ticket_counter_name": "First",
        "ticket_counter_description": "firsty",
        "ticket_counter_address": "222fdssssss",
        "workers": [
            {
                "user": 1,
                "ticket_counter": 3,
                "worker": 4,

            },
            {
                "user": 1,
                "ticket_counter": 3,
                "worker": 5,

            },

        ]
 }
这是我想要的

{
        "ticket_counter_name": "First",
        "ticket_counter_description": "firsty",
        "ticket_counter_address": "222fdssssss",
        "workers": 2 # just the total count
 }
如何只显示总计数

您可以使用注释执行此操作,并将其序列化为
整型字段
,如:

class TicketCounterSerializer(serializers.ModelSerializer):
    num_workers = serializers.IntegerField()
    class Meta:
        model = TicketCounter
        fields = (
            'ticket_counter_name',
            'ticket_counter_description',
            'ticket_counter_address',
            'num_workers',
         )
因此,我们使用包含相关
WorkerToTicketCounter
对象数量的属性
num\u workers
对每个
TicketCounter
对象进行注释


然而,就我个人而言,我认为这个模型有一些奇怪的名字:
TicketCounter
看起来并不像一个计数器。虽然我不知道您的应用程序的全部范围,但我认为名为
Ticket
Worker
的模型可能更有意义。

我没有使用ModelViewSet。我只是在使用
ListApiView
@Naroju:两者的界面大致相同,因此将
ModelViewSet
替换为
ListApiView
:)我可以知道计数中的“工人”是多少吗?这是你的名字吗?计数问题还没有解决。我们需要导入
Count
?@Naroju:这是相关的名称,导入语句位于代码片段的顶部。请您看看这个问题好吗
from django.db.models import Count

class TicketCounterViewSet(viewsets.ListApiView):
    queryset = TicketCounter.objects.annotate(num_workers=Count('workers'))
    serializer_class = TicketCounterSerializer