2014-11-19 4 views
1

Я немного зациклился на том, как выполнить задачу, поэтому было интересно, сможет ли кто-нибудь помочь.Результаты фильтра Django

У меня есть эта модель и модель формы:

class Prefabrication(models.Model): 
    prefabrication_id = models.AutoField(primary_key=True) 
    matlist = models.ForeignKey(MatList, blank=True, null=True) 
    sizelist = models.ForeignKey(SizeList, blank=True, null=True) 
    quantity = models.IntegerField(blank=True, null=True) 
    workpack = models.ForeignKey(Workpack, blank=True, null=True) 
    code = models.CharField(max_length=50) 
    lineclass = models.ForeignKey(Lineclass, blank=True, null=True) 


class CreateNewPrefabForm(forms.ModelForm): 
    class Meta: 
     model = Prefabrication 
     fields = ('prefabrication_id', 'matlist', 'sizelist', 
        'quantity', 'workpack', 'lineclass') 

Это представляет собой форму я использую для сбора информации от пользователя.

Я пытаюсь получить определенное значение из таблицы поиска на основе matlist и sizelist значений, заданных пользователем.

Я попытался с помощью этого:

if request.method == 'POST': 
    if createprefabcons['newprefab'].is_valid(): 
     item = Lineclass.objects.filter(itemname__icontains=createprefabcons['newprefab'].cleaned_data['matlist'], 
             dn1__icontains=createprefabcons['newprefab'].cleaned_data['sizelist'], 
             lineclassname__icontains=createprefabcons['newprefab'].cleaned_data['matlist']) 
     createprefabcons['newprefab'].cleaned_data['code'] = item 
     createprefabcons['newprefab'].save() 
     return HttpResponseRedirect('/') 

с фильтрами, чтобы попытаться получить код пункта возвращенного фильтрации. Насколько я знаю, должен быть только одним элементом, возвращенным из поиска фильтра, и этот элемент будет иметь код, который я хочу добавить после того, как пользователь дал данные для поиска.

Все хранится в дБ, но поле кода пуст, так что либо я делаю что-то неправильно, либо нет значения, которое соответствует, если фильтрация выполняется правильно, это должно быть совпадение. Может кто-нибудь, пожалуйста, дайте совет.

Большое спасибо.

ответ

2

filter() возвращает QuerySet() который является list-like и полный объектов модели. Поэтому, даже если есть только один результат, вам может потребоваться вытащить его из возвращаемого списка.

item = Lineclass.objects.filter()[0] 

Вы можете быть лучше использовать .get(), если вы ожидаете там быть только одна запись, это будет также проверить предположение, так как он будет бросать исключение, если более чем один вход возвращается. Возможно, что-то вроде этого:

try: 
    item = Lineclass.objects.get(itemname__icontains=createprefabcons['newprefab'].cleaned_data['matlist'], dn1__icontains=createprefabcons['newprefab'].cleaned_data['sizelist'], lineclassname__icontains=createprefabcons['newprefab'].cleaned_data['matlist']) 
except Lineclass.DoesNotExist: 
    # handle case where no items are found 
    do_stuff() 
createprefabcons['newprefab'].cleaned_data['code'] = item 
+0

Благодарим за помощь! После этого метода get() возвратил 2 элемента, поэтому я снова попробовал фильтр, используя item = Lineclass.objects.filter() [0], чтобы увидеть, что возвращается, и, кажется, возвращает только первый столбец таблицы , lineclass_id, который равен 11011, но не всей строке. То же самое, если я попытаюсь использовать Lineclass.objects.filter() [1]. –

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