作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的 models.py
class Language(models.Model):
language_id = models.BigAutoField(primary_key=True)
language_name = models.CharField(max_length=255)
created_on = models.DateTimeField(auto_now=True)
latest_build_on = models.DateTimeField(auto_now_add=True)
latest_version = models.DecimalField(max_digits=5, decimal_places=2)
company = models.OneToOneField('Company',on_delete=models.CASCADE,related_name='language')
def __str__(self):
return self.language_name
class Frameworks(models.Model):
framework_id = models.BigAutoField(primary_key=True)
framework_name = models.CharField(max_length=255)
framework_logo = models.FileField()
created_on = models.DateTimeField(auto_now=True)
latest_build_on = models.DateTimeField(auto_now_add=True)
latest_version = models.DecimalField(max_digits=5, decimal_places=2)
language = models.ForeignKey('Language',on_delete=models.CASCADE,related_name='frameworks')
def __str__(self):
return self.framework_name
class Technologies(models.Model):
technology_id = models.BigAutoField(primary_key=True)
technology_name = models.CharField(max_length=255)
description = models.TextField()
language = models.ManyToManyField('Language',related_name='technology')
def __str__(self):
return self.technology_name
这里是serializers.py
class GetLanguageSerializer(serializers.ModelSerializer):
technology = serializers.StringRelatedField(many=True)
frameworks = serializers.StringRelatedField(many=True)
class Meta:
model = Language
fields = ('language_name','created_on','latest_build_on','latest_version','company','technology','frameworks')
depth = 1
class LanguageSerializer(serializers.ModelSerializer):
class Meta:
model = Language
fields = ('language_name','created_on','latest_build_on','latest_version','company')
class GetFrameworksSerializer(serializers.ModelSerializer):
language = serializers.StringRelatedField()
class Meta:
model = Frameworks
fields = '__all__'
depth = 1
class FrameworksSerializer(serializers.ModelSerializer):
class Meta:
model = Frameworks
fields = '__all__'
这是我的观点.py
class LanguageView(viewsets.ModelViewSet):
queryset = Language.objects.all()
serializer_class = LanguageSerializer
filter_backends = [SearchFilter,OrderingFilter]
search_fields = ['language_name']
def get_serializer_class(self):
serializer_class = self.serializer_class
if self.request.method == 'GET':
serializer_class = GetLanguageSerializer
return serializer_class
class FrameworksView(viewsets.ModelViewSet):
queryset = Frameworks.objects.all()
serializer_class = FrameworksSerializer
filter_backends = [SearchFilter,OrderingFilter]
search_fields = ['framework_name']
def get_serializer_class(self):
serializer_class = self.serializer_class
if self.request.method == 'GET':
serializer_class = GetFrameworksSerializer
return serializer_class
这里我得到这样的API:
[
{
"language_name": "python",
"created_on": "2018-10-03T04:59:37.407717Z",
"latest_build_on": "2018-10-03T04:59:37.407801Z",
"latest_version": "3.60",
"company": {
"company_id": 1,
"company_name": "Guido van dom rossum",
"started_from": "2018-10-03T04:58:54.889132Z",
"country": "Netherland",
"email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1a727f766a5a6a636e72757434797577" rel="noreferrer noopener nofollow">[email protected]</a>",
"website": "https://python.org",
"ip": "127.0.0.1",
"active": true
},
"technology": [
"blockchain",
"machine learning"
],
"frameworks": [
"django",
"flask",
"bottle"
]
}
]
但我期待:
[
{
"language_name": "python",
"created_on": "2018-10-03T04:59:37.407717Z",
"latest_build_on": "2018-10-03T04:59:37.407801Z",
"latest_version": "3.60",
"total_technology":2,
"toatl_frameworks": 3,
"company": {
"company_id": 1,
"company_name": "Guido van dom rossum",
"started_from": "2018-10-03T04:58:54.889132Z",
"country": "Netherland",
"email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="69010c05192919101d010607470a0604" rel="noreferrer noopener nofollow">[email protected]</a>",
"website": "https://python.org",
"ip": "127.0.0.1",
"active": true
},
"technology": [
"blockchain",
"machine learning"
],
"frameworks": [
"django",
"flask",
"bottle"
]
}
]
在我的 api 中我期待
"total_technology":2,
"toatl_frameworks": 3,
这两个额外的字段按组计数“技术”和“框架”请看看我的代码..
如果是相同型号则不是问题。但在这里我想要外键所以我很困惑..
最佳答案
使用SerializerMethodField()
在你的序列化器中
class GetLanguageSerializer(serializers.ModelSerializer):
technology = serializers.StringRelatedField(many=True)
frameworks = serializers.StringRelatedField(many=True)
<b>total_technology = serializers.SerializerMethodField(read_only=True)
toatl_frameworks = serializers.SerializerMethodField(read_only=True)
def get_toatl_frameworks(self, language):
return language.frameworks.count()
def get_total_technology(self, language):
return language.technology.count() # change 'technology' with corresponding "related_name" value</b>
class Meta:
model = Language
<b>fields = (other_fileds, 'total_technology', 'toatl_frameworks')</b>
depth = 1
关于python - 如何在 django Rest 框架中使用外键进行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52639457/
我是一名优秀的程序员,十分优秀!