gpt4 book ai didi

python - 相关模型上的django rest framework过滤器

转载 作者:行者123 更新时间:2023-12-04 17:57:32 28 4
gpt4 key购买 nike

我有一个模型国家和一个在某一年去某个国家度假的人的模型。我想要一个国家 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')

模型国家的内容

id|country
1|France
2|Italy
3|Spain

模型 PersonYear 的内容

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')

View .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 次。你能解释一下我做错了什么以及如何得到我想要的吗。

更新一:

我不希望在 2014 年只为 John 提供一个特殊的解决方案。我想要一个针对 AnyYear 中 Anyperson 的所有实例的解决方案。例如,我还希望以下过滤器给我一个结果: http://localhost:8001/api/country/?personyears__person=Mary&personyears__year=2014

更新2:

我尝试替换:

 queryset = Country.objects.all()

通过:

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

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

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

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

localhost:8000/country/?personyears__person=Mary&personyears__year=2015

我预计不会有结果(Mary 在 2015 年没有去任何国家度假)。但是我得到了

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

最佳答案

您的查询集应该是:

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

这将返回所有国家/地区的列表。

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

关于python - 相关模型上的django rest framework过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39080701/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com