2014-12-01 2 views
0

У меня есть счет инвентаря, в котором есть N местоположений, это место нужно считать N раз, поэтому у меня есть одна модель для «заголовка местоположения» и другая для списка элементов каждого заголовка.Django/Python Цепочки и сортировка Querysets

Мне нужно цепи, сортировать и получить уникальные результаты элементов в N querysets

У меня есть это:

loc_id = request.POST['loc_id'] # the Id of my location pivot 
inv_location = InventoryLocations.objects.get(pk=loc_id) # get the location count pivot 
inv_locations = InventoryLocations.objects.filter(location=inv_location.location, 
       inventory=inv_location.inventory) #get all related locations counts 

# At this point i can have N inv_locations 

count_items = [] # list of items in all inventory counts 
for l in inv_locations: 
    items = InventoryDetails.objects.filter(inventory_location = l) # get items of every count 
    count_items.append(items) 

# Now I have all the items counted in the counts_items array, I need to get from this a single 
# list of items Ordered and not repeated  

all_items = chain(count_items) <<< IS THIS CORRECT?? 
sorted_items = sorted(all_items,key=lambda item: item.epc) << THIS GIVE ME ERROR 
unique_items = ??? 

Мои модели являются:

class InventoryCount(models.Model): 
    ...nothing important 

class InventoryLocation(models.Model): 
    inventory= models.ForeignKey(InventoryCount) 
    location= models.ForeignKey(Location) 
    ... 

class InventoryDetails(models.Model): 
    inventory_location= models.ForeignKey(InventoryLocations) 
    epc = models.CharField(max_length=25, null=True, blank=True) 
    item= models.ForeignKey(Item) 
    ... 

В принципе, мне нужно список всех предметов, учтенных во всех инвентаряхДетали в массиве отсортированы по epc и не повторяются

Я застрял здесь, я не знаю, правильно ли цепь делает это правильно, и функция sort дает мне ошибку, говоря, что элемент не имеет атрибута «epc».

Справка plz!

+0

Можете ли вы добавить свои модели plz? – cdvv7788

ответ

1

Чтобы решить вашу проблему, при условии, что это itertools.chain, chain принимает несколько итераций. Используйте chain(*count_items), чтобы развернуть список запросов.

Но вы можете сэкономить некоторые неприятности, используя InventoryDetails.objects.filter(inventory_location__in=inv_locations).order_by('epc').distinct() - это сделает сортировку и уникальность в базе данных, а не делает это в вашем представлении.

+0

с пустым параметром в distinct() будет уникальным все поля? или я должен помещать поле типа .distinct ('epc')? –

+0

Подробные сведения см. В документах: https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct. Краткая версия, она объединяет все поля - каждый Строка DB будет возвращена только один раз. Возможно, вам это не понадобится, и если вы хотите, чтобы каждый 'epc' только один раз вам понадобится сделать эту часть на Python. Только для PostgreSQL вы можете использовать '.distinct ('epc')'. –

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