DRF ForeignKey值未部分显示

时间:2018-07-26 05:23:18

标签: python django-rest-framework python-3.6

我是python django的新手,仅几个星期。这是我的第一个问题。

我在使用DRF ForeignKey时发现了问题。外键值(名称)不显示。 我有3个彼此相关的表(品牌,国家/地区,BrandCountry)。在遵循了一些教程之后,在BrandCountry Entity中,我成功打印出了品牌名称(而不是ID),但是该名称不适用于相同的国家/地区代码结构。 country name not showing

我想知道是什么原因引起的。没有错误或警告消息。我尝试调试,查询正确运行(它正确选择了brand.name和country.name)。 correct query from debug

我想知道是因为:  -我将“代码”用作关系键而不是“ ID”?

  • 国家名称包含汉字(特殊字符)吗?

  • 还是我想念什么?

Models.py

res.json()

Serializers.py

class BrandCountry(models.Model):
    class Meta:
        db_table = 'brand_countries'

    brand = models.ForeignKey(to='brand.Brand', on_delete=models.CASCADE, related_name='ref_brand_country_brand')
    country_code = models.ForeignKey(to='country.Country',
                                    on_delete=models.CASCADE,
                                    related_name='ref_brand_country_country',
                                    max_length=45,
                                    db_column='country_code',
                                    to_field='code')

Views.py

class BrandCountrySerializer(serializers.ModelSerializer):
    brand_name = serializers.StringRelatedField(source='brand.name')
    country_name = serializers.StringRelatedField(source='country.name')

    class Meta:
        model = BrandCountry
        fields = ('id', 'brand_id', 'brand_name', 'country_code', 'country_name')

    @staticmethod
    def setup_eager_loading(queryset):
        queryset = queryset.select_related('brand','country_code')
        return queryset

我试图在这里调试并找到解决方案,在那里几乎花了超过1天的时间,但没有结果。如果有人可以帮助我,我真的很感激。抱歉,如果有东西丢失或不清楚。

1 个答案:

答案 0 :(得分:0)

您在序列化器中为country_name使用了错误引用。因此,将source='country.name'更改为source='country_code.name'

class BrandCountrySerializer(serializers.ModelSerializer):
    brand_name = serializers.StringRelatedField(source='brand.name')
    country_name = serializers.StringRelatedField(source='country_code.name') # Change is here <<<<

    class Meta:
        model = BrandCountry
        fields = ('id', 'brand_id', 'brand_name', 'country_code', 'country_name')

    @staticmethod
    def setup_eager_loading(queryset):
        queryset = queryset.select_related('brand','country_code')
        return queryset



更新
您可以尝试使用depth属性,如下所示:

class BrandCountrySerializer(serializers.ModelSerializer):
    class Meta:
        model = BrandCountry
        fields = '__all__'
        depth = 1

    @staticmethod
    def setup_eager_loading(queryset):
        queryset = queryset.select_related('brand', 'country_code')
        return queryset