2016-12-05 28 views
0
class Report(models.Model): 
    # .... 
    product = models.ForeignKey(Product) 


class Product(models.Model): 
    name = models.CharField(max_length=50) 


class Item(models.Model): 
    box = models.ForeignKey(BoxInTransport) 
    product = models.ForeignKey(Product) 


class BoxInTransport(models.Model): 
    transport = models.ForeignKey(Transport) 
    box = models.ForeignKey(Box) 

這是 - 簡而言之 - 模型的結構。ModelForm中的Django濾波器與特定型號

而且我有一個觀點,它可以讓我創建新報告:

class ReportCreateView(CreateView): 
    model = Report 
    form_class = ReportForm 

    def get_form_kwargs(self): 
     # updating to get argument from url 
     kwargs = super(DifferenceCreateView, self).get_form_kwargs() 
     kwargs.update(self.kwargs) 
     return kwargs 

和形式:

class ReportForm(ModelForm): 
    class Meta: 
     model = Report 
     fields = [ 
      'product' 
     ] 

    def __init__(self, box_nr=None, *args, **kwargs): 
     super(ReportForm, self).__init__(*args, **kwargs) 

     self.fields['product'].queryset = ??? 

我怎樣才能得到僅屬於一個特定的盒子,這些產品?爲了更清楚:

Item.objects.filter(box__box__box_code=box_nr) 

現在,我得到我需要的所有項目,但我需要通過self.fields [「產品」]只產品形態與這個新的項目:

只產品查詢集。

你能幫我嗎?

編輯

我已經試過這樣的事情:

def __init__(self, box_nr=None, *args, **kwargs): 
    super(ReportForm, self).__init__(*args, **kwargs) 
    queryset = Item.objects.filter(
     box__box__box_code=boxno 
    ) 
    none_queryset = Product.objects.none() 
    list_or_products = [p.product for p in queryset] 
    product_queryset = list(chain(none_queryset, list_or_products)) 
    self.fields['product'].queryset = product_queryset 

但是,第一 - 它看起來有點醜陋:),第二 - 這是行不通的:

AttributeError: 'list' object has no attribute 'all' 
+1

你的表結構沒有多大意義。爲什麼'Item'有一個外鍵給'BoxInTransit' **,**'BoxInTransit'有一個外鍵給'Item'? – e4c5

回答

1

你的__init__可能看起來像這樣:

def __init__(self, box_nr=None, *args, **kwargs): 
    super(ReportForm, self).__init__(*args, **kwargs) 

    qs = Product.objects.filter(item__box__box__box_code=box_nr) 
    self.fields['product'].queryset = qs 

基本上,您需要在ProductItem之間進行反向查找。您可以閱讀relevant documentation here

請注意:item__box__box__box_code=box_nr是基於我對您模型的理解。 item__box進行反向查找。休息可能需要根據您的模型定義進行一些調整。

+0

我將releated_name添加到Item模型中提交的產品中。然後:qs = Product.objects.filter(item__box__box__box_code = box_nr)。但是這給了我一個錯誤:相關字段得到無效查找:框 – Jeroj82

+0

然後使用您在反向查找中使用的相關名稱。 – karthikr

+0

我加了related_name ='item':) – Jeroj82