如何在仅连接部分外部查询集的 Django 中创建 ForeignKey?

How to create ForeignKey in Django that connects only part of foreign Queryset?

我正在为 Kiosk 创建后端,每个 Kiosk 模型都连接了 Location 模型。但是有些地方有标志'disabled'。我正在尝试从 Django Admin -> Kiosk 的下拉菜单中删除此 Locations,以便用户在 creating/updating Kiosk 实例时无法选择它。

我看到了两种可能的解决方法:

  1. 编辑 Kiosk 的 Django 管理页面,以便在下拉菜单中他只能看到过滤后的结果
  2. 使用将连接到 Kiosk 的过滤结果创建代理模型

很高兴听到您的建议、批评

我们建议模型如下所示:

class Location(models.Model):
    '''Location of Kiosks'''

    class Meta:
        verbose_name = "Location"
        verbose_name_plural = "Locations"

    def __str__(self):
        return self.name

    name = models.CharField('Name', max_length=60)
    description = models.TextField('Description')
    enabled = models.BooleanField('Location enabled', default=True)

class Kiosk(models.Model):
    '''Kiosk unit'''

    description = models.TextField('Description')
    uuid = models.CharField('Kiosk ID', unique=True, max_length=30)
    location = models.ForeignKey(to=Location, on_delete=models.CASCADE)


您可以将 limit_choices_to 传递给您的 ForeignKey 以便它的选择得到过滤

location = models.ForeignKey(
    Location,
    on_delete=models.CASCADE,
    limit_choices_to={'enabled': True},
)

您可以利用limit_choices_to=… parameter [Django-doc]来限制选项的数量:

class Kiosk(models.Model):
    '''Kiosk unit'''

    description = models.TextField('Description')
    uuid = models.CharField('Kiosk ID', unique=True, max_length=30)
    location = models.ForeignKey(
        Location,
        on_delete=models.CASCADE,
        <b>limit_choices_to={'enabled': True}</b>
    )