首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于django countries字段的过滤查询集

基于django countries字段的过滤查询集
EN

Stack Overflow用户
提问于 2020-08-31 19:45:46
回答 1查看 444关注 0票数 0

这是我的视点集:

代码语言:javascript
复制
class PollViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Poll.objects.all()
    serializer_class = PollSerializer()

    def get_queryset(self):
        country = self.kwargs.get('pk', None)
        if country is not None:
            django_countries.Countries.name(country)
            return self.queryset.filter(personality__country__name=country)
        else:
            country = self.request.user.preferred_country
            return self.queryset.filter(personality__country=country)

model.py:

代码语言:javascript
复制
from django_countries.fields import CountryField



    class Personality(models.Model):
        name = models.CharField(max_length=100)
        bio = models.TextField()
        age = models.IntegerField()
    
        class Gender(models.TextChoices):
            MALE = 'MALE', _('Male')
            FEMALE = 'FEMALE', _('Female')
            OTHER = 'OTHER', _('Other')
    
        gender = models.CharField(
            max_length=6,
            choices=Gender.choices,
            default=Gender.MALE,
        )
    
        country = CountryField(null=True)
        picture = models.ImageField(upload_to='uploads/profile_images/%Y/%m/%d')
    
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
    
        def __str__(self):
            return self.name



    class Poll(RulesModel):
        personality = models.OneToOneField(Personality, related_name='polls', on_delete=models.CASCADE)
        start_date = models.DateTimeField(null=True)
        end_date = models.DateTimeField(null=True)
    
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
    
        def __str__(self):
            return 'poll#' + str(self.id) + ' ' + self.personality.name

Urls.py

代码语言:javascript
复制
from django.conf.urls.static import static
from django.urls import path, include

from liderate import settings
from .views import PollViewSet, PersonalityViewSet, PollListViewSet

from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'polls', PollViewSet)
router.register(r'polls-list', PollListViewSet)
router.register(r'personalities', PersonalityViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

在这里,它会引发异常,即“不允许对CountryField或join字段执行不支持的查找'name‘”。

这是在if条件中提出的(else条件可以很好地工作)。是否有其他方法可以根据国家名称过滤查询集

我实际上只想查看在get url中作为参数传递的与国家相关的投票

EN

回答 1

Stack Overflow用户

发布于 2021-09-10 17:39:23

在基于CountryField的项目模型中,我有一个名为location_countries的字段。这是一个多项选择,我需要根据国家名称或项目其他字段中提供的任何其他信息来创建一个搜索。传统的方法,如“过滤器(Fieldname__icontains)或Q(fieldname__country__name)等失败。经过很多麻烦,搜索和思考,我终于设计了一个变通办法,是工作的我想要的。现在通过给任何关键字,例如"samo”在我的搜索域,它返回所有项目的基础上,“美属萨摩亚”或“阿富汗”,它收回所有项目的基础上,“阿富汗”。希望这也能帮助你。在普通的html输入标签中的搜索域命名为"searchTxt“。为了避免重复,我首先转换结果集,然后回到列表。

代码语言:javascript
复制
    def viewProjects(request):
        if request.user.is_authenticated:
            if 'searchTxt'  in  request.GET:
                qry = request.GET['searchTxt']
        
            countries_list = []
            pros = Project.objects.all()
                for pro in pros:
            
                    for i in pro.location_countries:
                        if qry.lower() in i.name.lower():                       
                            countries_list.append(pro.project_heading)

        
            res=Project.objects.filter(project_heading__in=countries_list)
        
            projs = Project.objects.filter(                                                 
                                            Q(project_id__icontains=qry)|                                           
                                            Q(project_heading__icontains=qry) |
                                            Q(project_description__icontains=qry)|
                                            Q(sla_type__icontains=qry)|
                                            Q(project_type__icontains=qry)|
                                            Q(project_priority__icontains=qry)|
                                            Q(location_countries__exact=qry)|                                       
                                            Q(location_cities__icontains=qry)|                                      
                                            Q(project_manager__username__icontains=qry)|                                        
                                            Q(escalation_manager__username__icontains=qry)                                      
                                        )

        
        
            project = list(chain(res, projs))
            prj = set(project)
            projects=list(prj)
           
            context = { 'projects':projects }
            return render(request, 'admin_view_projects.html', context)
        else:   
            projects = Project.objects.all()
        
            context = { 'projects':projects }
            return render(request, 'admin_view_projects.html', context)
    else:
        return redirect('index')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63670154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档