如何从关系模型中获得领域价值

时间:2020-03-31 13:21:13

标签: django django-rest-framework

我需要获取Foreignkey字段的值,而不是获取ID,而是获取链接模型的字段之一的值。

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 个答案:

答案 0 :(得分:1)

您可以在此处使用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',)

答案 1 :(得分:0)

好的决定

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