2014-11-19 3 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') 

:

나는이 모델 및 모델 형태를 갖는다.

매트리스트를 기반으로 한 조회 테이블에서 특정 값을 얻으려고 시도하고 있으며 사용자가 지정한 값인입니다. 내가 이것을 사용하여 시도했다

: 시도 및 필터링에 의해 반환 된 항목의 코드를 얻을 수있는 필터

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('/') 

. 내가 아는 한 은 필터 검색에서 반환 된 하나의 항목이어야하며 사용자가 검색 할 세부 정보를 지정한 후에 추가하려는 코드가 있어야합니다.

모든 것이 db에 저장되지만 코드 필드가 공백이므로 잘못된 값을 지정하거나 일치하는 값이 없습니다. 필터링이 올바르게 수행되면 일치가되어야합니다. 누구든지 조언을 해줄 수 있습니까?

대단히 감사합니다.

답변

2

filter()목록과 같은이고 모델 개체가 가득합니다. QuerySet()을 반환합니다. 그래서 결과가 하나라도 반환 된 목록에서 꺼내야 할 수도 있습니다.

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]를 사용해도 똑같습니다. –