Django嵌套序列化程序筛选器仅用于一个字段,而不是所有字段

Django嵌套序列化程序筛选器仅用于一个字段,而不是所有字段,django,django-models,django-rest-framework,django-serializer,Django,Django Models,Django Rest Framework,Django Serializer,我有两个序列化程序,如下所示。下面代码段的输出是Workers,并带有与所有字段相关联的票证计数器详细信息(Ticket\u Counter,Ticket\u Counter\u name,worker)。但我只需要一个字段,它是票务\柜台\名称 class WorkerSerializer(serializers.ModelSerializer): ticket_counter = WorkerToCounterSerializer(many=True, read_only=True

我有两个序列化程序,如下所示。下面代码段的输出是Workers,并带有与所有字段相关联的票证计数器详细信息(
Ticket\u Counter
Ticket\u Counter\u name
worker
)。但我只需要一个字段,它是
票务\柜台\名称

class WorkerSerializer(serializers.ModelSerializer):

    ticket_counter = WorkerToCounterSerializer(many=True, read_only=True)

    class Meta:
        model = User
        fields = (
                  'username',
                  'ticket_counter',
                  )

class WorkerToCounterSerializer(serializers.ModelSerializer):
    ticket_counter = SerializerMethodField()
    ticket_counter_name = serializers.CharField(source='ticket_counter.ticket_counter_name')

    class Meta:
        model = WorkerToTicketCounter
        list_serializer_class = FilteredListSerializer
        fields = (
            'ticket_counter',
            'ticket_counter_name',
            'worker',
        )

    def get_ticket_counter(self, obj):
        return obj.ticket_counter.pk

class FilteredListSerializer(ListSerializer):
    def to_representation(self, data):
        data = data.filter(worker_to_ticket_counter_is_deleted=False)[:1]
        return super(FilteredListSerializer, self).to_representation(data)
上面的代码段输出了什么

{
        "username": "xxxxxxxxxxx",
        "ticket_counter": [
            {
                "ticket_counter": 7,
                "ticket_counter_name": "Entrance Counter",
                "worker": 4,

            }
        ]
 }
但我想要的是

 {
        "username": "xxxxxxxxxxx",
        "ticket_counter": "Entrance Counter"
 }
我只需要
售票柜台的名称
。就我而言,一个工人不能有两个售票柜台。显然,它只提供一个
票务计数器
。可能吗

编辑:使用字符串
StringRelatedField

{
    "username": "xxxxxxxxxxx",
    "ticket_counter": [
          "Entrance Counter",
          "xxxxxxxxxxxxxxxx",
          "xxxxxxxxxxxxxxxx",
          "xxxxxxxxxxxxxxxx"
    ]
}
编辑:
WorkerToTicketCounter
Model

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='ticket_counter')
    worker_to_ticket_counter_is_deleted = models.BooleanField(default=False)
您可以使用:

注意:要使用
StringRelatedField
,您应该将
\uuu str\uuu
方法添加到您的
WorkerToTicketCounter
模型中:

class WorkerToTicketCounter:
    ...
    def __str__(self):
        return self.ticket_counter.ticket_counter_name

如果我理解正确,您只需要一个序列化方法字段即可执行过滤字符串表示

class WorkerSerializer(serializers.ModelSerializer):
    ticket_counter = serializers.SerializerMethodField(read_only=True)

    def get_ticket_counter(self, user):
        qs = user.ticket_counter.filter(worker_to_ticket_counter_is_deleted=False)
        if qs.exists() and hasattr(qs.first().ticket_counter, 'ticket_counter_name'):
            return qs.first().ticket_counter.ticket_counter_name
        return None

    class Meta:
        model = User
        fields = ('username', 'ticket_counter',)
类WorkerSerializer(serializers.ModelSerializer):
票证计数器=序列化程序。SerializerMethodField(只读=真)
def get_票证计数器(自身、用户):
qs=用户.票证\计数器.过滤器(工作人员\到\票证\计数器\已删除=错误)
如果qs.exists()和hasattr(qs.first().ticket\u counter,“ticket\u counter\u name”):
返回qs.first().ticket\u counter.ticket\u counter\u name
一无所获
类元:
模型=用户

字段=('username','ticket\u counter',)
\uuuuuunicode\uuuuuu
还是
\uuuuuu str\uuuuu
?但是,它是数组中
WorkerToTicketCounter
的每个实例的结果字符串。我已使用结果进行了编辑。我使用
WorkerToCounterSerializer
的原因是我可以在
FilteredListSerializer
中将它们筛选到一个实例。但是我只需要一个字段。你能添加
WorkerToTicketCounter
模型吗?你能添加你在下面的回答中提到的过滤器的想法吗?我说的是
FilteredListSerializer
来过滤
worker\u to\u ticket\u counter\u is\u deleted=False
。我已经添加了它,这意味着您需要显示
WorkerToTicketCounter
实例,其中包含
worker\u to\u ticket\u counter\u is\u deleted=False
。。。对吧?是的。只有一个
WorkerToTicketCounter
的实例会出现。如果
工作人员\u到\u票证\u计数器\u被删除=错误
。我能做到。我在问题中已经提到了。但我只需要
票务柜台\姓名
。不是所有的
ticket\u counter。ticket\u counter\u name
这是访问父模型字段
ticket\u counter\u name
的一种方式吗?是的。这都是关于你能看看这个问题吗
class WorkerSerializer(serializers.ModelSerializer):
    ticket_counter = serializers.SerializerMethodField(read_only=True)

    def get_ticket_counter(self, user):
        qs = user.ticket_counter.filter(worker_to_ticket_counter_is_deleted=False)
        if qs.exists() and hasattr(qs.first().ticket_counter, 'ticket_counter_name'):
            return qs.first().ticket_counter.ticket_counter_name
        return None

    class Meta:
        model = User
        fields = ('username', 'ticket_counter',)