微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python、Django:具有依赖项的外键 (models.py)

如何解决Python、Django:具有依赖项的外键 (models.py)

美好的一天,

我想问一下,是否可以确定对 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,unique=True)
    object_a = models.ForeignKey(Object_A,on_delete=models.CASCADE)
    date_created = models.DateTimeField(auto_Now_add=True)


class Object_C(models.Model):
    name = models.Charfield(max_length=50,on_delete=models.CASCADE)
    object_b = models.ForeignKey(Object_B,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 相关的选项?

希望我能以可以理解的方式解释我的问题,有人可以提供帮助或有想法!?祝您有美好的一天!

解决方法

您需要覆盖您的表单 __init__ 方法并接受一个关键字参数来指示要使用哪个 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 中使用它们,这会导致查找混乱。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。