Django中的通用对象“所有权”

时间:2009-07-14 12:18:09

标签: python django

假设我有以下型号:

class User(models.Model):
    pass

class A(models.Model):
    user = models.ForeignKey(User)

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

也就是说,每个用户拥有一些类型为A的对象,还有一些类型为B.现在,我正在编写一个通用接口,允许用户查看它拥有的任何对象。在视图中,当然我不能说像“objects = model.objects.filter(user = user)”这样的东西,因为B没有属性'user'。什么是最好的方法?

1 个答案:

答案 0 :(得分:0)

我这样做的方法是简单地通过B类上的对象'a'。所以在视图中,我会这样做:

objects = B.objects.get(user=a.user)
objects += A.objects.get(user=user)

我这样做的原因是因为这些基本上是两个数据库查询,一个用于检索一堆对象A,另一个用于检索一堆对象B.我不确定Django有可能检索两者的列表,这只是因为数据库继承的工作方式。

您也可以使用model inheritance。这将为包含公共字段的对象A和B创建一个基类,然后检索基类列表,然后转换为它们的正确类型。

修改:为了回应您的评论,我建议您创建一个包含此行的基类:

user = models.ForeignKey(User)

然后,类A和B可以从该基类继承,因此您现在可以从该类获取所有对象。假设你的基类叫做'C':

objects = C.objects.get(user=user)

这将获得所有的C,然后您可以通过遍历对象中的每个对象并确定它们的类型来确定它们的特定类型:

for object in objects:
    if object.A:
        #code
    if object.B:
        #code