簡體   English   中英

如何在Django Rest框架中使用外鍵計數

[英]How to get count with foreign key in django rest framework

這是我的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__'

這是我的views.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": "help@python.com",
      "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": "help@python.com",
      "website": "https://python.org",
      "ip": "127.0.0.1",
      "active": true
    },
    "technology": [
      "blockchain",
      "machine learning"
    ],
    "frameworks": [
      "django",
      "flask",
      "bottle"
    ]
  }
]

我在這里我的期望

"total_technology":2,
"toatl_frameworks": 3,

通過分組計算“技術”和“框架”這兩個額外的字段,請查看我的代碼。

如果是同一型號,則不成問題。 但是在這里我想用foreignkey,所以我很困惑。

在序列化器中使用SerializerMethodField()

class GetLanguageSerializer(serializers.ModelSerializer):
    technology = serializers.StringRelatedField(many=True)
    frameworks = serializers.StringRelatedField(many=True)

    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

    class Meta:
        model = Language
        fields = (other_fileds, 'total_technology', 'toatl_frameworks')
        depth = 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM