我是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天的时间,但没有结果。如果有人可以帮助我,我真的很感激。抱歉,如果有东西丢失或不清楚。
答案 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