【问题标题】:Accessing a variable other than a foreign key from a django model?从 django 模型访问除外键之外的变量?
【发布时间】:2013-09-18 14:54:37
【问题描述】:

我有一个名为“Product”的类模型,它具有以下属性:ID、编号和类型

class Product(models.Model):
        PRODUCT_TYPES = (
                ('CW', 'Casement Window'),
                ('BA', 'Bunny Advance'),
                ('EW', 'Enterprise Wadoo'),
                ('T3', 'Type 3')
                )

        number = models.CharField(max_length=50)
        type = models.CharField(max_length = 2 , choices=PRODUCT_TYPES)

我有一个名为“Project”的类模型,它具有以下属性:ID、编号和 product_id 指向“Product”的链接。

class Project(models.Model):
    number = models.CharField(max_length=50)
    product = models.ForeignKey(Product)

这就是它变得棘手的地方:我使用清晰的表单和自动完成来显示和编辑值。自动完成基于项目模型的值。因此,为了显示和编辑产品的 type 属性,我需要在我的项目模型中添加一个属性 type

问题:

  1. 是否可以将 models.ForeignKey 用于普通字段?如:

    type = models.ForeignKey(Product,related_name='type')

  2. 我尝试使用循环迭代每个产品并比较 ID,但我收到以下消息:“'ModelBase' 对象不可迭代

    def test(id_product):
       for p in Product:
           if p.number == id_product:
               return p.type
    

编辑:我只需要能够以任何可能的方式访问项目中的产品类型。

【问题讨论】:

    标签: django django-models autocomplete django-crispy-forms


    【解决方案1】:

    我很难理解您要完成的工作。但是,你不能循环遍历一个对象,但是

    for p in Products.objects.all():
        ....
    

    应该工作得很好。当ProjectForeignKeyProduct 时,同时输入ProductProject 似乎有点太多了。

    编辑:

    仍然没有意义,但您的测试方法应该产生类似

    return Products.objects.get(type=id_product)
    

    【讨论】:

    • 我添加了图像以便更清晰。我在 Project 中需要相同值的原因是脆的表单和自动完成需要此代码:widgets = {'customer': autocomplete_light.ChoiceWidget('CustomerAutocomplete'), 'product': autocomplete_light.ChoiceWidget('ProductAutocomplete'), } 所以,我需要为我想要自动完成的每个字段都有一个字段
    【解决方案2】:

    编辑:我只需要能够访问产品的类型 以任何可能的方式进行项目。

    我也不确定到底是什么问题,你不能正常访问它吗:

    <my-project-instance>.product.type
    

    访问项目中的产品类型。

    编辑:确保您使用的是项目的实例。您在使用类名时,下面的 cmets 失败了。

    【讨论】:

    • 这对我来说非常困难,因为这个应用程序只完成了一半并由其他人编写。我认为 foreign_key 正在返回密钥,而不是实际对象。你是在建议这样的事情吗? models.Project.product.type。因为在这种情况下,他没有将类型识别为产品的变量
    • 不,它指向对象实例,而不是键。您需要 Product 的 instance,而不是上面示例所示的类名。这就是为什么您的示例不起作用的原因。更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    相关资源
    最近更新 更多