2015-04-02 2 views
0

Учитывая Джанго 1.8, Python 2.7.5, PostgreSQL и следующие общие модели:Сравнение двух полей, так из двух отдельных моделей

class restAPI(models.Model): 
    rest_id = models.CharField(max_length=20) 
    rest_host = models.CharField(max_length=20) 
    rest_mode = models.CharField(max_length=20) 
    rest_state = models.CharField(max_length=20) 


class soapAPI(models.Model): 
    soap_id = models.CharField(max_length=20) 
    soap_host = models.CharField(max_length=20) 
    soap_asset = models.CharField(max_length=20) 
    soap_state = models.CharField(max_length=20) 

В идеальном мире soapAPI.soap_host и restAPI.rest_host будет соответствовать отлично. Однако это редко бывает. Я пытаюсь найти и вернуть любые хосты, которые присутствуют в soapAPI, которые не находятся в restAPI. У меня есть рабочий метод, в котором я разбираю эти данные с помощью python, прежде чем сохранять его в своей собственной модели в django, но я должен полагать, что я могу это сделать, используя сами модели (что, я думаю, будет более эффективным) ,

Как можно вернуть модель soapAPIВЕСЬ где soapAPI.soap_host отсутствует в restAPI.rest_host с использованием ORM предоставленной Джанго или использованием .raw(), предпочтительно с ORM? Любая помощь будет очень благодарна, поскольку это опыт обучения для меня. Заранее спасибо.

EDIT1

Полностью открыт для моделирования отношений как какая-то форма ответа, а также.

EDIT2

Оставляя открытым, я должен верить, что есть лучший способ сделать это, чем несколько querysets.

EDIT3

Кроме того, есть ли способ сделать muiltiple __in «с или что-то? Мне действительно нужно вернуть всю модель soapAPI, где soapAPI.soap_host отсутствует в restAPI.rest_hostИsoapAPI.soap_state is 'Live'.

ответ

0

Это лучшее, что я мог придумать, учитывая, что ответ @HassenPy дал:

excludehosts = restAPI.objects.values_list('rest_host', flat=True) 
missinghosts = soapAPI.objects.exclude(soap_host__in=excludehosts) 

EDIT

Чтобы ответить на мой собственный редактировать 3, это лучшее, что я мог придумать с:

excludehosts = restAPI.objects.values_list('rest_host', flat=True) 
missinghosts = soapAPI.objects.exclude(soap_host__in=excludehosts) 
missinghosts.filter(soap_state='Live') 

хотя выполнение следующих работ, а также:

excludehosts = restAPI.objects.values_list('rest_host', flat=True) 
soapAPI.objects.filter(soap_state='Live').exclude(soap_host__in=excludehosts) 

Не уверен, что технически лучше, так как я не могу честно отменить разницу в обратном времени, но это эффективные решения.

0

Это должно быть что-то вроде этого:

rest_hosts = restAPI.objects.only("rest_host") 
excluded_rest_hosts = [host.rest_host for host in rest_hosts] 
missing_soap_hosts = soapAPI.objects.exclude(soap_host__in=excluded_rest_hosts) 

Надеется, что это помогает!

+0

по какой-то причине я получаю это: 'FieldError: не удается разрешить ключевое слово 'rest_host' в поле. Возможны следующие варианты: id, soap_asset, soap_host, soap_id, soap_state' – beardedeagle

+0

Выяснил это и меньше кода. См. Мой ответ. Спасибо за то, что вы начали меня, но вы помогли сыграть важную роль. теперь, если бы я мог только выяснить, как это сделать в одном наборе запросов. – beardedeagle

+0

Я не вижу ответа O.o – HassenPy

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