从ForeignKey过滤属于用户的所有对象

时间:2014-03-13 14:35:53

标签: python django

我有两个型号

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)

在表单中,将显示foreignkey(MyClients)中的所有对象,但我只想过滤用户列出的客户端的名称,而不是Myclient模型中的所有客户端。我怎样才能在模特中实现这一点?

我知道我可以在视图中执行此操作但是可以在模型中完成吗?因为我希望用户在表单中选择一个客户端。

3 个答案:

答案 0 :(得分:1)

在模型上执行此操作是不正确的,您希望在表单上执行此操作。

如果您已经知道表单的用户实例,则可以在类级别使用queryset kwarg(在定义字段时):

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

但是,如果您在创建时只能访问用户实例,那么您仍然可以稍后覆盖查询集(通常在__init__中):

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

答案 1 :(得分:1)

在表单部分添加 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)

答案 2 :(得分:0)

您可以使用相关名称:

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

我不完全确定你为什么要在模型上这样做,这种逻辑的地方就是形式。

相关问题