2010-02-11 69 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

相關問題