【问题标题】:Django filter form field objects by existing one-to-one relationDjango通过现有的一对一关系过滤表单字段对象
【发布时间】:2021-12-23 05:37:29
【问题描述】:

我是 django 的新手,但仍在尝试找出基本的东西。 我有三种型号:pc、pcslot 和 card。 pcslot 包含与插槽和 pc 的关系。一台电脑可以有多个插槽,每张卡只能在一个插槽中。

class pcslot(models.Model):
    card = models.OneToOneField("card
        on_delete=models.SET_NULL,
        null=True,
        blank=True
    )
    computer = models.ForeignKey('pc',
        on_delete=models.CASCADE, 
        related_name='slots',
        editable=False
    )

现在我想从表单下拉列表中排除所有已分配的卡片。我试图通过将其添加到模型中来过滤表单内的对象

def get_related(self):
   if(hasattr(self, 'pcslot')):
       return 1
   return None

但是 django 对象过滤器无法访问这些方法,所以 filter(get_related=1) 不起作用:

类 pcslotForm(ModelForm): 元类: 型号 = pcslot fields = "全部" def init(self, user=None, **kwargs): super(pcslotForm, self).init(**kwargs) self.fields['card'].queryset = card.objects.filter(get_related=1)

最好的方法是什么?我是否必须遍历所有对象并进行比较,或者是否有我还不知道的内置方法? 谢谢

【问题讨论】:

    标签: django forms relationship


    【解决方案1】:

    现在我想从表单下拉列表中排除所有已分配的卡片。

    我假设您需要一个查询集,其中包含不在 pcslot.card 关系远端的所有卡片。如果是这样,那么您可以在过滤器中使用关系字段。所以

    cards_without_assigned_slots = card.objects.filter(pcslot__isnull=True)

    注意,用 CamelCase 命名你的类更符合 Python 风格(所以 Card 而不是 card

    【讨论】:

      猜你喜欢
      • 2018-01-15
      • 1970-01-01
      • 2021-03-19
      • 2015-08-08
      • 2015-10-15
      • 2023-03-06
      • 2014-09-29
      • 2013-04-27
      • 1970-01-01
      相关资源
      最近更新 更多