【问题标题】:Python, Django: ForeignKey with dependencies (models.py)Python,Django:具有依赖项的 ForeignKey (models.py)
【发布时间】:2021-06-09 11:16:52
【问题描述】:

早安,

我想问一下,是否可以确定对 models.ForeignKey 字段的额外依赖?比如……

models.py

class Object_A(models.Model):
    name = models.Charfield(max_length=50, null=False, blank=False, unique=True)
    date_created = models.DateTimeField(auto_now_add=True)


class Object_B(models.Model):
    name = models.Charfield(max_length=50, null=False, blank=False, unique=True)
    object_a = models.ForeignKey(Object_A, null=False, blank=False, on_delete=models.CASCADE)
    date_created = models.DateTimeField(auto_now_add=True)


class Object_C(models.Model):
    name = models.Charfield(max_length=50, null=False, blank=False, unique=True)
    object_a = models.ForeignKey(Object_A, null=False, blank=False, on_delete=models.CASCADE)
    object_b = models.ForeignKey(Object_B, null=False, blank=False, on_delete=models.CASCADE)
    date_created = models.DateTimeField(auto_now_add=True)

forms.py

class Create_Object_C_Form(ModelForm):
    class Meta:
        model = Object_C
        exclude = [
            'object_a',
            'date_created',
        ]

我要做什么......

如您所见,我排除了 object_a,因为此时在我的应用程序中使用表单的地方,用户不必选择 object_a。他自己的脚步已经预料到了这个选择! object_b 的情况相同——或至少几乎相同:是否可以只显示与同一 object_a 相关的选项?

希望我可以理解地解释我的问题,并且有人可以提供帮助或有想法!?祝你有美好的一天!

【问题讨论】:

    标签: python django django-models django-forms foreign-keys


    【解决方案1】:

    您需要覆盖您的表单 __init__ 方法并接受一个 keword 参数,该参数将指示要使用哪个 Object_A 实例:

    class Create_Object_C_Form(ModelForm):
        class Meta:
            model = Object_C
            exclude = [
                'object_a',
                'date_created',
            ]
       
        def __init__(self, *args, **kwargs):
            object_a = kwargs.pop('object_a') # get ObjectA from kwargs
            super().__init__(*args, **kwargs)
            self.fields['object_b'].queryset = object_a.object_b_set.all()
    

    现在,当您创建此表单时,您将向其传递您要使用的 ObjectA 实例:

    Create_Object_C_Form(object_a=object_a)
    

    注意:不要在类名中使用_,这是违反约定的。特别是不要在 Django 中使用它们,这会导致查找混乱。

    【讨论】:

    • 非常感谢您的帮助!是的,我从不在“真实”类名中使用 _ 。只有在像这里这样的论坛。它更容易阅读并且误解问题的可能性降低了。无论如何...再次非常感谢您!
    猜你喜欢
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2017-05-07
    • 2019-10-12
    相关资源
    最近更新 更多