2015-11-21 3 views
1

Я работаю с устаревшей базой данных, где у меня есть настройки сериализатора в Таблице А вот так -DRF - фильтр по 2 модели

class TblapplicationsSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Tblapplications 
     fields = ('applicationid', 'applicationname', 'description', 'drtierid', 'saglink', 'supportinstructions', 
        'defaultincidentpriorityid', 'applicationorigintypeid', 'installationtypeid', 'comments', 
        'lastmodifieddate', 'lastmodifiedby', 'assetstatusid', 'recordownerid', 'adl_app') 
     depth = 2 

Я использую стандартный фильтр -

class TblapplicationsFilter(django_filters.FilterSet): 
    name = django_filters.CharFilter(name="applicationname", lookup_type="exact") 
    env = django_filters.CharFilter(name="adl_app__environmentid__domain") 

    class Meta: 
     model = Tblapplications 
     fields = ['applicationname', 'name', 'env'] 

Вот где он идет боком. То, что я хочу сделать, - это фильтр по моему URL-адресу, например /api/applications/?name=xxx&env=DEV. Затем он вернет приложение и любые базы данных, которые связаны с окружающей средой DEV. Название было понятным, но единственное, что я выяснил, было то, что точка api для приложений касалась средней таблицы, которая связывает две, но возвращает несколько значений, потому что она захватывает каждый раз, когда приложение ссылается на отдельную базу данных.

Я обновил Сериализатор и Фильтр на основе предоставленных комментариев и сериализатора, без &env=DEV возвращает все соответствующие данные (domain вложен в обратную связь). Затем я хочу, чтобы мой фильтр отфильтровывал результаты на основе этого. Это означает, что ему нужно как-то знать, чтобы ограничить результаты по обратной связи только тем, что предоставляется из вложенного значения.

Если вы видите мои модели -

class Tblapplicationdatabaselinks(models.Model): 
    id = models.AutoField(db_column='ID', primary_key=True) 
    applicationid = models.ForeignKey('Tblapplications', db_column='applicationId', to_field='applicationid', 
             related_name='adl_app') 
    dbid = models.ForeignKey('Tbldatabases', db_column='dbId', to_field='id', related_name='adl_db') 
    environmentid = models.ForeignKey('Tbldomaincodes', db_column='environmentId', to_field='id', 
             related_name='adl_envlink') 
    comments = models.TextField(blank=True) 
    lastmodifieddate = models.DateTimeField(db_column='lastModifiedDate', blank=True, null=True) 
    lastmodifiedby = models.CharField(db_column='lastModifiedBy', max_length=255, blank=True) 
# upsize_ts = models.TextField(blank=True) # This field type is a guess. 

    class Meta: 
     managed = False 
     db_table = 'tblApplicationDatabaseLinks' 

class Tblapplications(models.Model): 
    applicationid = models.AutoField(db_column='applicationId', primary_key=True) 
    applicationname = models.CharField(db_column='applicationName', max_length=255) 
    description = models.TextField(blank=True) 
    drtierid = models.ForeignKey(Tbldomaincodes, db_column='drTierID', blank=True, null=True, to_field='id', 
           related_name='app_drtier') 
    saglink = models.TextField(db_column='sagLink', blank=True) 
    supportinstructions = models.TextField(db_column='supportInstructions', blank=True) 
    defaultincidentpriorityid = models.IntegerField(db_column='defaultIncidentPriorityId', blank=True, null=True) 
    applicationorigintypeid = models.IntegerField(db_column='applicationOriginTypeId') 
    installationtypeid = models.ForeignKey(Tbldomaincodes, db_column='installationTypeId', to_field='id', 
              related_name='app_insttype') 
    comments = models.TextField(blank=True) 
    assetstatusid = models.ForeignKey(Tbldomaincodes, db_column='assetStatusId', to_field='id', 
             related_name='app_status') 
    recordownerid = models.ForeignKey(Tblusergroups, db_column='recordOwnerId', blank=True, null=True, 
             to_field='groupid', related_name='app_owner') 
    lastmodifieddate = models.DateTimeField(db_column='lastModifiedDate', blank=True, null=True) 
    lastmodifiedby = models.CharField(db_column='lastModifiedBy', max_length=255, blank=True) 
# upsize_ts = models.TextField(blank=True) # This field type is a guess. 

    class Meta: 
     managed = False 
     db_table = 'tblApplications' 

class Tbldatabases(models.Model): 
    dbid = models.AutoField(db_column='dbId', primary_key=True) 
    dbname = models.CharField(db_column='dbName', max_length=255) 
    serverid = models.ForeignKey('Tblservers', db_column='serverId', to_field='serverid', related_name='db_serv') 
    servicename = models.CharField(db_column='serviceName', max_length=255, blank=True) 
    dbtypeid = models.IntegerField(db_column='dbTypeId', blank=True, null=True) 
    inceptiondate = models.DateTimeField(db_column='inceptionDate', blank=True, null=True) 
    comments = models.TextField(blank=True) 
    assetstatusid = models.IntegerField(db_column='assetStatusId') 
    recordownerid = models.IntegerField(db_column='recordOwnerId', blank=True, null=True) 
    lastmodifieddate = models.DateTimeField(db_column='lastModifiedDate', blank=True, null=True) 
    lastmodifiedby = models.CharField(db_column='lastModifiedBy', max_length=255, blank=True) 
# upsize_ts = models.TextField(blank=True) # This field type is a guess. 

    class Meta: 
     managed = False 
     db_table = 'tblDatabases' 

class Tbldomaincodes(models.Model): 
    id = models.IntegerField(db_column='ID', primary_key=True) 
    domain = models.CharField(primary_key=True, max_length=255) 
    displayname = models.CharField(db_column='displayName', primary_key=True, max_length=255) 
    displayorder = models.IntegerField(db_column='displayOrder', blank=True, null=True) 
    comments = models.TextField(blank=True) 
    lastmodifieddate = models.DateTimeField(db_column='lastModifiedDate', blank=True, null=True) 
    lastmodifiedby = models.CharField(db_column='lastModifiedBy', max_length=255, blank=True) 
# upsize_ts = models.TextField(blank=True) # This field type is a guess. 

    class Meta: 
     managed = False 
     db_table = 'tblDomainCodes' 

ответ

1

Расширьте набор фильтров и ссылаться на поле в другой модели:

class TblapplicationsFilter(django_filters.FilterSet): 
    name = django_filters.CharFilter(name="applicationname", lookup_type="exact") 
    env = django_filters.CharFilter(name="environmentid__name") 
    #         ^^^^^^^^^^^^^^^^^^^ 

    class Meta: 
     model = Tblapplications 
     fields = ['applicationname', 'name', 'env'] 

Кроме того, вы можете назвать ваши ForeignKey поля без id суффикс, который является соглашением Django. В Django, когда вы обращаетесь к Tblapplications.environmentid, это, как правило, экземпляр модели, а не фактическое целое число.

+0

Thnx. к сожалению, я работаю с устаревшей БД, поэтому не изменяю имена полей. Тем не менее, я пробовал это, но, к сожалению, потому что отображение происходит из обратного отношения, оно не работает, вместо этого возвращается, что оно не может найти поле 'environmentid'. Я изменяю его на 'adl_app__environmentid__name', который не является ошибкой, но затем ничего не возвращает. – whoisearth

+0

Я обновил, надеюсь, иметь больше смысла. – whoisearth

+1

Чтобы отладить, что происходит, запишите все SQL-запросы в консоль с помощью [этого ответа] (http://stackoverflow.com/a/11922878/20712). Вы можете отлаживать отношения в интерактивном режиме с помощью 'python manage.py shell', импортировать ваши модели и затем фильтровать, глядя на напечатанный SQL для консоли, например' foo_model.objects.filter (adl_app__environmentid__name = 'bar') ' –

Смежные вопросы