2017-07-26 5 views
0

i ont deux modèlesDjango-filtre filtrant modèle étranger

class Sku(models.Model): 
    manufacturer = models.ForeignKey('Manufacturer') 

class Manufacturer(models.Model): 
    title = models.CharField() 

Je veux que le filtrage est apparu que les fabricants associés à l'ensemble actuel de sku.

my view part: 
c['skus'] = self.object.skus.filter(hide=False, prices__price_type=PRICE_ROZN).prefetch_related('prices', 
                             'stock').all().order_by(
      'prices__value') 
     sku_filter = SkuFilter(self.request.GET, c['skus']) 

Si l'auto existait à ce moment-là, je filtrer les fabricants de cette façon:

class SkuFilter(django_filters.FilterSet): 
    # manufacturer__title = django_filters.CharFilter(lookup_expr='icontains') 


    manufacturer = django_filters.filters.ModelMultipleChoiceFilter(
     name='manufacturer', 
     to_field_name='title', 
     queryset=Manufacturer.objects.filter(
      pk__in=self.queryset.objects.values_list('manufacturer').distinct()), 

    ) 

    class Meta: 
     model = Sku 
     fields = ['manufacturer', ] 

Mais il est évident qu'au moment du soi n'existe pas encore.

Répondre

0

Je résolu cette question par cette méthode:

  1. créer le terrain sans filttration comme (Manufacturer.objects.all())

  2. attente pour la magie metaclass créer champ base_fitler

  3. annuler init et remplacer le filtre actuel

    class SkuFilter(django_filters.FilterSet): 
    
        def __init__(self, data=None, queryset=None, prefix=None, strict=None): 
         self.base_filters['manufacturer'] = django_filters.filters.ModelMultipleChoiceFilter(
         name='manufacturer', 
         to_field_name='title', 
         queryset=Manufacturer.objects.filter(
          pk__in=queryset.values_list('manufacturer').distinct()), 
        ) 
         super().__init__(data, queryset, prefix, strict) 
    
        manufacturer = django_filters.filters.ModelMultipleChoiceFilter(
         name='manufacturer', 
         to_field_name='title', 
         queryset=Manufacturer.objects.all() 
        ) 
    
        class Meta: 
         model = Sku 
         fields = ['manufacturer', ]