2010-02-11 53 views
3

我有这样的:如何获取ForeignKey字段而不是Django中的相关对象?

Class A(models.Model): 
    name = models.CharField(max_length=50) 

Class B(models.Model): 
    a = models.ForeignKey(A) 

class C(models.Model): 
    a = models.ManyToManyField(A) 

当我需要的属性aC对象:

related_manager = getattr(object_c,'a') 

,这给我一个ManyRelatedManager但问题是,当我需要的属性aB的对象:

object_b2 = getattr(object_b,'a') 

这给了我一个对象t的类B和我需要知道如果是一个ForeignKey或ManyToManyField,我的意思是,我需要getattr(东西,'some_attribute'),并得到模型。*不是自我的对象。

+0

如果你'getattr(object_c,'a')''你真的得到了类B的对象吗?我期望得到Class ** A **的对象。 – 2010-02-11 21:03:34

+0

是的,这确实发生。试一试。在ManyToMany getattr为您提供管理器,就像如果您调用object.my_many_to_many_field ...您仍然必须调用.get()或.all()以从中获取对象。 – 2010-02-11 21:27:44

+0

@Felix,它不是B类的对象,它是管理器:。 getattr与object_c.a和object_b.a的工作方式相同。 – Dingle 2010-02-12 19:52:24

回答

6

我以前碰到过getattr。模型内省是解决方案。

如果您知道字段名称,最好的方法是在对象的_meta部分(ooooh,scary!)中使用方法。

object_b2._meta.get_field_by_name('a')[0] 

[0]最后是因为该方法实际上在元组中返回了许多其他有用和有趣的信息。但如果你只是想要这个领域本身,那就是这样做的。

没有给出代码,如果您不知道该字段的名称,则执行此操作的方法是迭代_meta.fields,并找到field.rel.to是您正在查找的模型。

祝你好运!

-1

A ForeignKey只能导致一个模型。如果您在访问属性时需要获取经理,请使用ManyToManyan intermediary table,该账户的ForeignKey已启用unique

+0

你误解了这个问题。他的问题是getattr在一个foreignkey上查询相关模型并返回一个对象,而在manytomany上的getattr则返回一个对象管理器。 – 2010-02-11 21:32:19

相关问题