【问题标题】:ForeignKey to specific queryset django特定查询集 django 的 ForeignKey
【发布时间】:2020-11-28 12:34:32
【问题描述】:

有没有办法引用Model 的特定对象?假设我有一些如下模型:

# models.py

class VehicleCategoryCode(models.Model):
    category = models.CharField(max_length=5)
    name = models.CharField(max_length=20)

class Code(models.Model):
    category = models.ForeignKey(VehicleCategoryCode, on_delete=models.CASCADE)
    index = models.CharField(max_length=4, blank=True)
    label = models.CharField(max_length=50)
    order = models.CharField(max_length=20, blank=True)
    is_active = models.BooleanField(default=True)

# pay attention to the Model
class Vehicle(models.Model):
    label = models.CharField(max_length=80)
    model = models.CharField(max_length=30)

目前Vehicle 未链接到任何模型。

现在代码模型是 VehicleCategoryCode 的 ForeignKey,它有两个对象。在 VehicleCategoryCode 中,第一个对象 label(为方便起见)将由 Vehicle.label 引用,第二个对象 model(再次为方便起见)将由 Vehicle 引用。模型。因此 Vehicle 中的每个字段都可以引用相同的模型,但可以引用不同的对象。

所以基本上我想知道是否可以实现下面的伪代码。

class Vehicle(models.Model):
    label = models.ForeignKey(VehicleCategoryCode__name='label', on_delete=models.CASCADE)
    model = models.ForeignKey(VehicleCategoryCOde__name='model', on_delete=models.CASCADE)

任何建议或意见将不胜感激。谢谢。

【问题讨论】:

    标签: python django


    【解决方案1】:

    您可以使用limit_choices_to=… parameter [Django-doc]:

    Vehicle(models.Model):
        label = models.ForeignKey(
            Code,
            limit_choices_to={'category__name': 'label'},
            on_delete=models.CASCADE
        )
        model = models.ForeignKey(
            Code,
            limit_choices_to={'category__name': 'model'},
            on_delete=models.CASCADE
        )

    对于ModelForms 和ModelAdmin,它将限制选择,但请注意,数据库强制执行这些选项。

    【讨论】:

    • 感谢您的回答。然而,当我处理数据库时,我遇到了一个问题。为每个模型制作一个单独的模型是唯一的解决方法吗?
    • @harryghgim:通常每个模型只制作一张桌子,每个ManyToManyField 制作一张桌子,仅此而已。 limit_choices_to 甚至与数据库没有任何关系。
    猜你喜欢
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    相关资源
    最近更新 更多