我有两个1-1关系的模型(本质上是一个资源池)。对于示例代码,我将简单地使用螺母和螺栓。将有更多的螺母(可用资源)比螺栓(每个将需要1个螺母)。但是,如果螺母只能分配给一个螺栓。
该约束很容易设置为ForeignKey方法的unique=True命名参数。
问题来自于模型形式。呈现时,窗体将包含下拉列表中的每个螺母。我想限制它只显示那些还没有被螺栓声称的坚果。
我知道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

最佳答案

试试这个:

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

我会选择最后一个作为最直截了当的(尽管在其他两种情况下,列表和dict实际上并没有创建:django“理解”意图,而没有明确提到.query
另外,想想丹尼尔·罗斯曼的回答。这是做同样事情的另一种方法。

10-06 14:23