Как получить значение поля из модели отношений - PullRequest
0 голосов
/ 31 марта 2020

Мне нужно получить значение поля foreignkey не как идентификатор, а как значение одного из полей связанной модели.

models.py

class RfiParticipation(models.Model):
    ...
    vendor = models.ForeignKey('Vendors', models.DO_NOTHING, related_name='to_vendor')
    m = models.ForeignKey('Modules', models.DO_NOTHING, related_name='to_modules')
    ...

class Modules(models.Model):
    MODULES_NAME = (....
                    )
    mid = models.AutoField(primary_key=True)
    module_name = models.CharField(max_length=50, choices=MODULES_NAME, unique=True)

serializer.py

class VendorsManagementListSerializer(serializers.ModelSerializer):
    company_information = serializers.SerializerMethodField()
    vendor_modules = serializers.SerializerMethodField()

    class Meta:
        model = Vendors
        fields = ('vendor_name',
                  ...
                  'company_information',
                  'vendor_modules',)


    def get_vendor_modules(self, obj):
        r = RfiParticipation.objects.filter(vendor=obj).order_by('rfi').values('m', 'rfi')
        return r

Теперь этот запрос r = RfiParticipation.objects.filter(vendor=obj).order_by('rfi').values('m', 'rfi') возвращается к я:

 "vendor_modules": [

            {
                "m": 2,
                "rfi": "20R1"
            },
            {
                "m": 3,
                "rfi": "20R1"
            },
            {
                "m": 4,
                "rfi": "20R1"
            }
        ]

Как я могу сделать m: module_name вместо m: 2? Где module_name - поле из модели модулей. Я пытаюсь .values('m.module_name', 'rfi'), но получил

Cannot resolve keyword 'm.module_name' into field. Choices are: active, id, m, m_id, rfi, rfi_id, timestamp, user_id, vendor, vendor_id

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Вы можете использовать SlugRelatedField здесь. Например:

class RFISerializer(serializers.ModelSerializer):
    to_modules = serializers.SlugRelatedField(
        many=True,
        read_only=True,
        slug_field='module_name'
    ) # using to_modules as it was used as related field

    class Meta:
        model = RfiParticipation
        fields = ['rfi', 'to_modules']


class VendorsManagementListSerializer(serializers.ModelSerializer):
    vendor_modules = RFISerializer(source='m')

    class Meta:
        model = Vendors
        fields = ('vendor_name',
                  ...
                  'vendor_modules',)
0 голосов
/ 31 марта 2020

Хорошее решение)

r = RfiParticipation.objects.filter(vendor=obj).order_by('rfi').values(module=F('m__module_name'), round=F('rfi'))
...