Django queryset返回所有未分配的fks

时间:2010-01-20 20:58:47

标签: python django django-models

我有2个关系为1-1的模型(本质上是资源池)。对于示例代码,我将简单地使用螺母和螺栓。将会有比螺栓更多的螺母(可用资源)(每个螺母需要1个螺母)。但是,如果螺母只能分配给一个螺栓。

使用uniqueKey方法的unique = True命名参数设置约束很容易。

问题来自ModelForm。渲染时,表单将在下拉列表中包含每个螺母。我想限制它只显示尚未用螺栓声明的螺母。

我知道ModelForm类的fields属性,但是无法提出足以解决问题的查询集过滤器。以下是我的问题的示例代码:

from django.db import models
from django.forms import ModelForm

# Create your models here.

class Nut(models.Model):
    size = models.CharField()

class Bolt(models.Model):
    size = models.CharField()
    nut = models.ForeignKey( Nut, unique=True )

class BoltForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(BoltForm, self).__init__(*args, **kwargs)
        self.fields['nut'].queryset = # All unassigned nuts

2 个答案:

答案 0 :(得分:4)

试试这个:

self.fields['nut'].queryset = Nut.objects.exclude(
    pk__in=Bolt.objects.values('nut').query)

<强>更新

生成相同sql查询的三个表达式:

pk__in=Bolt.objects.values('nut')
pk__in=Bolt.objects.values_list('nut')
pk__in=Bolt.objects.values('nut').query

我选择最后一个作为最直接的(尽管在其他两个案例中,列表和字典实际上并未创建:django'理解'意图而没有明确提及.query

另外,请考虑丹尼尔罗斯曼的回答。这是做同样事情的另一种方法。

答案 1 :(得分:1)

Nut.objects.filter(bolt=None)