Несколько моделей в Django-фильтре 1.1.0 - PullRequest
0 голосов
/ 03 декабря 2018

Я бы хотел внедрить фильтр для конечного пользователя сайта, чтобы он мог фильтровать по цене, рейтингу, полу и местоположению.

Проблема в том, что цена и рейтинг хранятся вкласс модели "комментарий", а также расположение и пол в классе моделей "приключение".

В классе "комментарий" ссылка на "приключение" осуществляется по внешнему ключу.

Как можноЯ использую Django-фильтр 1.1.0 в моем файле filters.py, чтобы обратиться к обеим моделям «комментарий» и «приключение», которые ссылаются друг на друга, для фильтрации в соответствии с вышеупомянутыми аргументами?

Вот мой код, который работает, но только фильтры класса "приключение".Как я могу расширить этот код, чтобы также фильтровать по внешним ссылочным аргументам, чтобы возвращать совпадающие приключения?

filters.py

import django_filters

class AdventureFilter(django_filters.FilterSet):
      class Meta:
            model = Adventure
            fields = {
            'gender',
            'location',
            }

models.py

class Comment(models.Model):
    verfasser = models.ForeignKey(User, on_delete=models.CASCADE)
    related_adventure = models.ForeignKey(Adventure, on_delete=models.CASCADE, related_name='comments')
    rating_choices = (
                      (1, '1 Stern'),
                      (2, '2 Sterne'),
                      (3, '3 Sterne'),
                      (4, '4 Sterne'),
                      (5, '5 Sterne')
    )       
    Rating = models.PositiveIntegerField(null=True, choices=rating_choices,blank=False, default=0)
    verfasst_am = models.DateTimeField(default=timezone.now, blank=True, null=True)
    heading = models.CharField(max_length=100,blank=True,null=True, help_text="100 Zeichen")
    ratingtext= models.TextField(max_length=400, blank=True, null=True,help_text="400 Zeichen")

    price = models.PositiveIntegerField(null=True, help_text="Deine Ausgaben (pro Kopf) bei diesem Adventure", blank=True)



class Adventure(models.Model):
    adventure_id = models.AutoField(primary_key=True)
    owner = models.ForeignKey(User,on_delete=models.CASCADE, null=True)
    name = models.CharField(max_length=64)
    place = PlacesField(blank=False)
    location_CHOICES = (
            ('IN', 'indoor'),
            ('OUT', 'outdoor'),
            ('INOUT', 'indoor and outdoor'),
    )
    location = models.CharField(
            max_length=10,
            choices=lokation_CHOICES,
    )


    gender_CHOICES = (
            ('male', 'male'),
            ('female', 'female'),
            (EGAL, 'egal'),
    )
    gender= models.CharField(
            max_length=9,
            choices=geschlecht_CHOICES,
            default=EGAL,
    )

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Запись fields = {'gender','location',} как fields = {'gender','location','comments__price', 'comments__Rating'}.

0 голосов
/ 03 декабря 2018

Это пример из документов:

class ProductFilter(django_filters.FilterSet):
    price = django_filters.NumberFilter()
    price__gt = django_filters.NumberFilter(name='price', lookup_expr='gt')
    price__lt = django_filters.NumberFilter(name='price', lookup_expr='lt')

    release_year = django_filters.NumberFilter(name='release_date', lookup_expr='year')
    release_year__gt = django_filters.NumberFilter(name='release_date', lookup_expr='year__gt')
    release_year__lt = django_filters.NumberFilter(name='release_date', lookup_expr='year__lt')

    manufacturer__name = django_filters.CharFilter(lookup_expr='icontains')

    class Meta:
        model = Product

Существует два основных аргумента для фильтров:

  • name: имя поля моделифильтровать по.Вы можете просматривать «пути отношений», используя синтаксис __ Django для фильтрации полей в связанной модели.Например, название производителя.

  • lookup_expr: поиск поля для использования при фильтрации.Синтаксис Django __ может снова использоваться для поддержки преобразований поиска.ex, year__gte.

Обратите внимание на цепочку "__", и я думаю, что вы можете использовать ее напрямую, не делая этого явного материала внутри полей = []

Ссылка на документ: https://django -filter.readthedocs.io / en / stable / guide / use.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...