簡體   English   中英

從ForeignKey過濾屬於用戶的所有對象

[英]Filter All Objects That Belongs To a User From ForeignKey

我有兩個模型

class MyClients(models.Model):
    user=models.ForeignKey(User)
    client_name=models.CharField(max_length=100)
    client_address=models.CharField(max_length=100,null=True, blank=True)


class MyIvoice(models.Model):
    user=models.ForeignKey(User)
    my_client=models.ForeignKey(MyClients)

在表單中,將顯示外鍵(MyClients)中的所有對象,但我只想過濾用戶列出的客戶端名稱,而不是Myclient模型中的所有客戶端。 如何在模型中執行此操作?

我了解我可以在視圖中執行此操作,但是可以在模型中執行此操作嗎? 由於我希望用戶在表單中選擇一個客戶端。

在模型上執行此操作是不正確的,您要在表單上執行操作。

如果您已經知道表單的用戶實例,則可以在類級別使用queryset kwarg進行操作(在定義字段時):

client = forms.ModelChoiceField(queryset=MyClients.objects.filter(user=my_user))

但是,如果您僅在創建時有權訪問用戶實例,則仍然可以稍后覆蓋查詢集(通常在__init__ ):

self.fields['client'].queryset = MyClients.objects.filter(user=my_user)

在表單部分中添加一個init函數:

class MyForm(forms.Form, FormMixin):
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        self.user = user
        super(MyForm, self).__init__(*args, **kwargs)
        # do stuff
        self.fields['myclient'].queryset = user.myclient_set.all()

然后在視圖部分中將user=request.user作為形式arg添加。

def my_view(request, id=None):
    # do stuff to get your instance
    form = MyForm(request.POST or None, instance=instance, user=request.user)

您可以使用相關名稱:

# Gets all MyClient objects for a user
user.myclient_set.all()

我不確定您為什么要在模型上執行此操作,這種邏輯的位置就是表格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM