2017-01-30 4 views
0

Пусть даны Джанго модель ...Query модель Джанго данных из внешнего источника

models.py

class UserRelationship: 
    user_id - IntegerField 
    staff_id - IntegerField 
    valid_from - DateTimeField 

... и какая-то логика, которая извлекает данные из внешнего API ,

api.py

class Approval: 
    user_id - Int 
    created_at - DateTime 

С перечнем "согласований":

approvals = [{'user_id': <user_id>, 'created_at': <created_at>}, ...] 

Мне нужно найти эффективный способ вывода "staff_id" на момент утверждения для списка объектов «утверждения».

Я не могу придумать способ сделать это с помощью django ORM.

Я знаю, что мы можем сделать сложную Lookups с объектами Q:

from django.db.models import Q 

qs = UserRelationship.obejcts.filter(Q(user_id=<user_id>) & Q(created_at__lte=<created_at>)) 

но вот только для одной комбинации user_id/created_at, как я могу это сделать для большого списка (~ 20k +) от «утверждения».

Любая помощь или советы будут очень благодарны. Большое спасибо.

+0

На данный момент ваш вопрос слишком широк. Откуда берутся эти утверждения. И BTW, не можете ли вы опубликовать свои фактические модели вместо этого синтаксически неправильного материала? – e4c5

ответ

2

Учитывая список «утверждения» (производный от внешнего источника), например

approvals = [{'user_id': <user_id>, 'created_at': <created_at>}, ...] 

Мне нужно найти эффективный способ, чтобы найти «staff_id» на момент утверждения для списка ~ 20k + «утверждения» объектов.

т.е. для каждого Dict найти соответствующий ряд, где

approval.user_id = user_relationship.user_id and approval.created_at <= user_relationship.valid_from 

Эффективности будет иметь значение много зависит от вашего внешнего источника данных, индексирования и т.д. Но для вашего прямого вопроса о том, как сформулировать запрос, best place to start is with django.db.models.Q:

Если вам нужно выполнить более сложные запросы (например, запросы с OR заявления), вы можете использовать Q объектов.

Q объект (django.db.models.Q) представляет собой объект, используемый для инкапсуляции коллекции ключевых аргументов. Эти аргументы ключевых слов указаны в разделе «Поиск по полю» выше.

filters = Q() 
for x in approvals: 
    filters |= Q(user_id=x['user_id'], valid_from__lte=x['created_at']) 
relationships = UserRelationship.objects.filter(filers) 

И вы можете получить staff_id обернув над relationships QuerySet.В этом примере предполагается, что у вас есть уникальный user_id s в списке утверждений, чтобы вы могли вернуться и связать правильное утверждение с правильным staff_id. Если вы можете иметь кратность одного и того же user_id в списке утверждений, вам просто нужно разделить свои утверждения таким образом, чтобы user_id не отображался более одного раза в каждом разделе.

partitions = [] 
check_ids = [] 
for x in approvals: 
    current_partition = None 
    current_check_id = None 
    for partition, check_id in zip(partitions, check_ids): 
     if x['user_id'] not in check_id: 
      current_partition = partition 
      current_check_id = check_id 

    if current_partition is None: 
     partitions.append(list()) 
     check_ids.append(set()) 
     current_partition = partitions[-1] 
     current_check_id = check_ids[-1] 
    current_check_id.add(x['user_id'] 
    current_partition.append(x) 

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

  • Нет связанных вопросов^_^