【问题标题】:Get related model with Django query使用 Django 查询获取相关模型
【发布时间】:2014-02-21 06:02:24
【问题描述】:

你能帮我处理 Django 查询吗?我是这方面的新手,我正在尝试优化我网站中的查询。以下是当前案例: 我使用标准用户模型作为基本模型,并有 3 种类型的用户,它们与之相关:A、B 和 C。“用户”只能与这 3 种模型中的一种相关。目前我有一个包含模型 D 实例的列表,它也与用户相关。 下面是我的代码

D = D.objects.all()
for element in D:
try:
     results.append(element.user.A)
except:
    try:
        results.append(element.user.B)
    except:
        results.append(element.user.C)

正如您已经注意到的那样,这个解决方案在这种情况下并不是最好的(也许这是最糟糕的)。我很感激任何帮助。 提前致谢。

编辑:这是和我的模型:

class A(models.Model)
    facebook_id = models.CharField(max_length=20, blank=True, null=True)
    user = models.OneToOneField(User, unique=True)
    ...

class B(models.Model)
    user = models.OneToOneField(User, unique=True)
    ...

class C(models.Model)
    user = models.OneToOneField(User, unique=True)
    ...

class D(models.Model):
    user = models.ForeignKey(User)
    F = models.ForeignKey(F)

【问题讨论】:

  • 请给我们看看你的models.py
  • 您确定要将用户扩展拆分到三个不同的模型中吗?他们有多么不同。也许您可以创建一个类型字段并使用choices=(('A', 'User type A'), ('B', 'User type B'), ('C', 'User type C'),)
  • @remy_g,感谢您的建议,但不幸的是,这两个模型完全不同。

标签: python django django-queryset


【解决方案1】:

实际上我前段时间也遇到过同样的问题,如果我再做一次,无论模型有多么不同,我都会按照 remy_g 的提示进行操作。

话虽如此,您可以使用 hasattr() 代替凌乱的 try / except nest。

http://docs.python.org/2/library/functions.html#getattr

它会是什么样子:

D = D.objects.all()
for element in D:
    if hasattr(element.user, "A"):
        results.append(element.user.A)
    elif hasattr(element.user, "B"):
        results.append(element.user.B)
    elif hasattr(element.user, "C"):
        results.append(element.user.C)

你可以根据自己的喜好改进它,但你明白了......

希望这会有所帮助,

问候,

【讨论】:

  • 感谢您的建议。实际上,这现在可以正常工作。如果我仍然有类似的问题,也许会使用@remy_g 建议:)
猜你喜欢
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 2018-09-13
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
相关资源
最近更新 更多