代码之家  ›  专栏  ›  技术社区  ›  balu

如何确定模型的列是否为外键?

  •  11
  • balu  · 技术社区  · 14 年前

    根据请求,我正在数据库中动态存储信息:

    // table, id and column are provided by the request
    table_obj = getattr(models, table)
    record = table_obj.objects.get(pk=id)
    
    setattr(record, column, request.POST['value'])
    

    问题在于请求。post['value']有时包含外部记录的主键(即整数),而django希望列的值是ForeignModel类型的对象:

    无法分配“U'122”:“modela.b”必须是“modelb”实例。

    现在,是否有一种优雅的方法来动态检查b是否是包含外键的列,以及这些键链接到什么模型?(以便我可以用它的主键加载外部记录,并将其分配给ModelA?)或者Django没有向程序员提供这样的信息,所以我真的必须把手弄脏,并在外键列上使用isInstance()?

    4 回复  |  直到 6 年前
        1
  •  13
  •   John Montgomery    14 年前

    您可以在模型元对象上使用get-field-by-name:

    
    from django.db.models import ForeignKey
    
    def get_fk_model(model, fieldname):
        '''returns None if not foreignkey, otherswise the relevant model'''
        field_object, model, direct, m2m = model._meta.get_field_by_name(fieldname)
        if not m2m and direct and isinstance(field_object, ForeignKey):
            return field_object.rel.to
        return None
    
    

    假设您有一个模型类MyModel,那么您将使用它:

    
    fk_model = get_fk_model(MyModel, 'fieldname')
    
    
        2
  •  3
  •   zhihong    6 年前

    简单地用一行代码查找与另一行代码的所有关系 models 存在于 model :

    In [8]: relations = [f for f in Model._meta.get_fields() if (f.many_to_one or f.one_to_one) and f.auto_created]
    

    上面会给出 list 在所有的 模型 与他们的 relations .

    例子:

    In [9]: relations
    Out[9]:
    [<ManyToOneRel: app1.model1>,
     <ManyToOneRel: app2.model1>,
     <OneToOneRel: app1.model2>,
     <OneToOneRel: app3.model5>,
     <OneToOneRel: app5.model1>]
    
        3
  •  1
  •   ultrajohn    12 年前

    我遇到了相同的用例,而被接受的答案并不能直接为我工作。如果相关的话,我使用的是django 1.2。相反,我用了 get_field_by_name 方法如下。

    def get_foreign_keys(self):
            foreign_keys = []
            for field in self._meta.fields:
                if isinstance(self._meta.get_field_by_name(field.name)[0], models.ForeignKey):
                    foreign_keys.append(field.name)
    
            if not foreign_keys:
                return None
            return foreign_keys
    

    这是在类内定义的方法。对于我的案例,我需要的是ForeignKey字段的名称。干杯!

        4
  •  0
  •   John Mee    14 年前

    浏览“ModelChoiceField”字段。他们能解决你把外国钥匙放进表格里的问题吗?而不是你自己去做。

    http://docs.djangoproject.com/en/1.1/ref/forms/fields/#fields-which-handle-relationships

    record = forms.ModelChoiceField(queryset=table_obj.objects.all())