我有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
答案 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)