相关mod上的Django rest框架过滤器

2024-10-01 00:23:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个模范国家和一个在某一年去一个国家度假的模范人物。我想有一个国家的Api,在其中我可以过滤的国家,只有某些人在某一年度假。在

在模型.py在

from django.db import models

class Country(models.Model):
  id = models.CharField(max_length=50,primary_key=True)
  country = models.CharField(max_length=255,null=True)

class PersonYear(models.Model):
  id = models.IntegerField(primary_key=True)
  person = models.CharField(max_length=255,null=True)
  year = models.IntegerField(null=True)
  country = models.ForeignKey(Country, related_name='personyears')

示范国目录

^{pr2}$

模特儿服装内容

id|person|year|country_id
1|John|2014|1
2|John|2015|1
3|Mary|2014|1

在序列化程序.py在

from apiapp.models import PersonYear,Country
from rest_framework import serializers

class PersonyearSerializer(serializers.HyperlinkedModelSerializer):

   class Meta:
      model = PersonYear
      fields = ('id','person','year')

class CountrySerializer(serializers.HyperlinkedModelSerializer):
   personyears = PersonyearSerializer(many=True)

   class Meta:
      model = Country
      fields = ('id','country','personyears')

在视图.py在

import rest_framework_filters as filters

class PersonyearFilter(filters.FilterSet):
   id = filters.AllLookupsFilter(name='id')
   person = filters.AllLookupsFilter(name='person')
   year = filters.AllLookupsFilter(name='year')

   class Meta:
      model = PersonYear

class PersonyearViewSet(viewsets.ModelViewSet):
   queryset = PersonYear.objects.all()
   serializer_class = PersonyearSerializer
   filter_backends = (filters.backends.DjangoFilterBackend,)
   filter_fields =  ['id','person','year']
   filter_class = PersonyearFilter

class CountryFilter(filters.FilterSet):
   id = filters.AllLookupsFilter(name='id')
   nm = filters.AllLookupsFilter(name='country')
   personyears = filters.RelatedFilter(PersonyearFilter,name='personyears') 

   class Meta:
      model = Country 

class CountryViewSet(viewsets.ModelViewSet):
   queryset = Country.objects.all()
   serializer_class = CountrySerializer
   filter_backends = (filters.backends.DjangoFilterBackend,)
   filter_fields = ['id','country','personyears']
   filter_class = CountryFilter

我想从2014年约翰度假的所有国家中选出:

http://localhost:8000/country/?personyears__person=John&personyears__year=2014

我希望得到一张唱片:

{"id": "1", "country": "France",
   "personyears": [
    {   "id": 1,
        "person": "John"
        "year": 2014
    }
]
}

但是我把这张唱片重复了4次。你能解释一下我做错了什么,怎么得到我想要的吗。在

更新1:

我不想在2014年给约翰一个特别的解决方案。我想要一个解决任何人在任何一年的所有实例。例如,我还希望下面的过滤器给出一个结果: http://localhost:8001/api/country/?personyears__person=Mary&personyears__year=2014

更新2:

我试着替换:

 queryset = Country.objects.all()

签署人:

 queryset = Country.objects.all().distinct()

它有助于获得预期(1个记录)的结果:

在本地主机:8000/国家/地区/?personyears_uuperson=John&;personyears_yuyear=2014年

但我现在得到了person='Mary'/year='2015'的意外/意外结果

在本地主机:8000/国家/地区/?personyears_uperson=Mary&personyears_uuyear=2015年

我没想到会有结果(玛丽2015年没有去任何国家度假)。但我有

  {"id": "1","country": "France",
   "personyears": [
            {
                "id": 1,
                "person": "John",
                "year": 2014
            },
            {
                "id": 2,
                "person": "John",
                "year": 2015
            },
            {
                "id": 3,
                "person": "Mary",
                "year": 2014
            }
   ]
   }

Tags: nameidtruemodels国家filterjohnyear
1条回答
网友
1楼 · 发布于 2024-10-01 00:23:19

您的queryset应该是:

Country.objects.filter(personyears__year='your_year', person='your_person').values_list('country', flat=True)

这将返回所有国家的列表。在

注意:这将根据不同用户的姓名进行过滤。应该还有一个模型Person,它的foreign key应该映射到PersonYear。在

相关问题 更多 >