Получайте данные без увеличения глубины в Django Rest Framework - PullRequest
0 голосов
/ 06 августа 2020

В моем приложении Django я получаю значение pk для связанного поля, я хочу заменить его комбинацией некоторых других полей

Json:

{
        "transaction_no": 2321,
        "dispatch_date": "2020-08-01T09:19:37Z",
        "send_from_warehouse": "ABC",
        "model": "Rent",
        "vehicle_number": "__________",
        "transport_by": "Market Transport Vendor",
        "is_delivered": false,
        "sales_order": {
            "owner": "2"
        }
    },

Чтобы заменить 2 на first_name, я попробовал SlugRelatedField следующим образом:

Serializers.py

class AtableSOSerializer(serializers.ModelSerializer):

    owner = serializers.SlugRelatedField(read_only=True, slug_field='first_name')

    class Meta:
        model = MaterialRequest
        fields = ('owner',)


class AllotmentTableSerializer(serializers.ModelSerializer):

    sales_order = AtableSOSerializer(read_only=True)
    send_from_warehouse = serializers.SlugRelatedField(read_only=True, slug_field='name')
    transport_by = serializers.SlugRelatedField(read_only=True, slug_field='name')

    class Meta:
        model = Allotment
        fields = ('transaction_no', 'dispatch_date', 'send_from_warehouse', 'model', 'vehicle_number', 'transport_by',
                  'is_delivered', 'sales_order')

и получил first_name

Json:

{
        "transaction_no": 2321,
        "dispatch_date": "2020-08-01T09:19:37Z",
        "send_from_warehouse": "Yantraksh Logistics Private limited_GGNPC1",
        "model": "Rent",
        "vehicle_number": "__________",
        "transport_by": "Market Transport Vendor",
        "is_delivered": false,
        "sales_order": {
            "owner": "Foo"
        }
    },

Но как я могу получить комбинацию first_name + last_name в поле owner?

Здесь owner относится к пользователю Поле

1 Ответ

1 голос
/ 06 августа 2020

Используйте serializers.SerializerMethodField - (DRF do c) as,

class AtableSOSerializer(serializers.ModelSerializer):
    <b>owner = serializers.SerializerMethodField()

    def get_owner(self, instance):
        return "%s %s" % (instance.owner.first_name, instance.owner.last_name)</b>

    class Meta:
        model = MaterialRequest
        fields = ('owner',)
...