过滤一对多关系

时间:2018-01-17 09:25:34

标签: python django django-filter

我正在使用django-filter,我想问你是否可以过滤掉一对多的reliontionship,因为我甚至没有在StackOverflow上找到任何文档或示例。这里是模型,过滤器和视图< / p>

class Aliens(models.Model):
    class Meta:
        db_table = 'aliens'
        verbose_name = ('Introduction Event')
        verbose_name_plural = ('Introuction Events')
        ordering = ['alien']

    alien = models.OneToOneField(Taxonomy, verbose_name=u"Non-indigenous Species",
                                 on_delete=models.CASCADE, null=True, blank=True)
    #SpeciesName = models.CharField(max_length=100, verbose_name=u"Species Name", blank=True, null=True)
    group = models.OneToOneField(Ecofunctional, verbose_name=u"Ecofunctional Group", on_delete=models.CASCADE,
                                 blank=True, null=True, default='')
    firstsight = models.IntegerField(('First Mediterranean Sighting'), choices=YEAR_CHOICES, blank=True, null=True)
    med_citation = models.ForeignKey(biblio, verbose_name=u"Mediterranean first citation", on_delete=models.CASCADE,
                                     null=True, blank=True)
    origin = models.OneToOneField(Origin, on_delete=models.CASCADE, blank=True, null=True, default='',
                                  verbose_name=u"Origin")
    status = models.OneToOneField(SuccessType, on_delete=models.CASCADE, blank=True, null=True, default='',
                                  verbose_name=u"Establishement")
    created_by = CurrentUserField()
    created_at = models.DateField('date of inclusion', blank=True, null=True, default=datetime.datetime.now())

    photo = models.ImageField(upload_to='photos', blank=True, null=True)
    vector = models.ManyToManyField(vectors, verbose_name=u"Vectors/Pathways")
    updated_at = models.DateField('date of updating', blank=True, null=True, default=datetime.datetime.now())
    updated_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='%(class)s_requests_updated',
                                   default=CurrentUserField(), null=True)
    notes = models.TextField(verbose_name='Notes', blank=True, null=True)
    db_status = StateField(verbose_name='Species Status in the Db', blank=True, null=True)

    def __str__(self):  # __unicode__ on Python 2
        return self.alien.SpeciesName


class Distributions(models.Model):
    class Meta:
        db_table = 'distributions'
        verbose_name = ('verified occurence')
        verbose_name_plural = ('verified occurences')

    alien = models.ForeignKey(Aliens, verbose_name=u"Non-Indeginous Species", related_name='distributions',
                              on_delete=models.CASCADE, null=True, blank=True)
    country = models.OneToOneField(Country, on_delete=models.CASCADE, verbose_name='Country', blank=True, null=True)
    seas = models.OneToOneField(regionalseas, on_delete=models.CASCADE, verbose_name='Regional Sea', blank=True,
                                null=True)
    MSFD = models.OneToOneField(MSFD, on_delete=models.CASCADE, verbose_name='MSFD/EcAp Sub-region', blank=True,
                                null=True)
    area1stSighting = models.DateField('First Areas Sighting', blank=True, null=True, default=datetime.datetime.now())
    AreaSuccessType = models.OneToOneField(SuccessType, on_delete=models.CASCADE,
                                           verbose_name='Area Establishement/Success', blank=True, null=True)
    Area_citation = models.ForeignKey(biblio, verbose_name=u"Area first citation", on_delete=models.CASCADE, null=True,
                                      blank=True)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='%(class)s_requests_created',
                                   default='')
    created_at = models.DateField('date of Edition', blank=True, null=True, default=datetime.datetime.now())
    updated_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='%(class)s_requests_updated',
                                   default='')
    updated_at = models.DateField('date of updating', blank=True, null=True, default=datetime.datetime.now())
    notes = models.TextField(verbose_name='Notes', blank=True, null=True)
    dverification = StateField(verbose_name='Validated ')

    def __str__(self):  # __unicode__ on Python 2
        return self.alien.SpeciesName


class AliensFilter(django_filters.FilterSet):

    country = filters.ModelChoiceFilter(label='Country', queryset=Country.objects.all())
    msfd = filters.ModelChoiceFilter(label='MSF/EcAp Subregions', queryset=MSFD.objects.all())
    regseas = filters.ModelChoiceFilter(label='Regional Seas', queryset=regionalseas.objects.all())
    vector = filters.ModelChoiceFilter(label='Vectors/Pathway', queryset=vectors.objects.all())
    Species = filters.ModelChoiceFilter(label='Species Name', queryset=Taxonomy.objects.all())

    class Meta:
        model = Aliens
        fields = (
            'Species', 'group', 'origin', 'firstsight', 'status', 'vector', 'country', 'msfd', 'regseas')


def search(request):
    Aliens_list = Aliens.objects.all().select_related('origin', 'status', 'group', 'Taxonomy')
    aliens_filter = AliensFilter(request.GET, queryset=Aliens_list)
    # return render(request, 'mamias/list.html', {'filter': aliens_filter})
    return render(request, 'mamias/list2.html', {'filter': aliens_filter})

我如何根据国家/地区进行过滤?

1 个答案:

答案 0 :(得分:0)

AlieanCountry模型之间没有直接关系。您需要通过distributions关系按国家/地区进行过滤。

from django_filters import FilterSet, filters

class AlienFilter(FilterSet):
    country = filters.ModelChoiceFilter(
        field_name='distributions__country',
        queryset=Country.objects.all(),
    )