У меня есть два сериализатора, как показано ниже. Выходные данные для приведенного ниже фрагмента: «Рабочие» и со связанными данными счетчика билетов со всеми полями (ticket_counter
, ticket_counter_name
, worker
). Но мне нужно только одно поле, которое ticket_counter_name
.
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"
}
Мне просто нужно имя ticket_counter_name
. В моем случае не может быть двух счетчиков ticket_counter для работника. Очевидно, это дает только один ticket_counter
. Является ли это возможным?
РЕДАКТИРОВАТЬ: используя строку StringRelatedField
{
"username": "xxxxxxxxxxx",
"ticket_counter": [
"Entrance Counter",
"xxxxxxxxxxxxxxxx",
"xxxxxxxxxxxxxxxx",
"xxxxxxxxxxxxxxxx"
]
}
РЕДАКТИРОВАТЬ: WorkerToTicketCounter
Модель
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)