Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Django查询获取相关模型_Python_Django_Django Queryset - Fatal编程技术网

Python 使用Django查询获取相关模型

Python 使用Django查询获取相关模型,python,django,django-queryset,Python,Django,Django Queryset,你能帮我查一下Django吗。我是这方面的新手,我正在尝试优化我网站中的查询。目前的情况如下: 我使用标准用户模型作为基础模型,有3种类型的用户,它们与之相关:A、B和C。“用户”只能与这3种模型中的一种相关。目前,我有一个来自模型D的实例列表,它也与用户相关。 下面是我的代码 D = D.objects.all() for element in D: try: results.append(element.user.A) except: try: result

你能帮我查一下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)

事实上,不久前我也遇到过同样的问题,如果我再这样做的话,不管模型有多不同,我都会遵循雷米的暗示

也就是说,您可以使用hasattr()而不是凌乱的try/except嵌套

它会是什么样子:

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)
你可以根据自己的喜好改进它,但你得到了这个想法

希望这有帮助


关于,

请向我们展示您的型号。py您确定要在三种不同型号中拆分用户扩展吗?它们有多不同。也许您可以创建一个类型字段并使用
选项=(('a','User type a'),('B','User type B'),('C','User type C'),)
@remy_g,谢谢您的建议,但不幸的是这两个模型不同。谢谢您的建议。事实上,现在这一切都很好。如果我仍然有类似的问题,可能会使用@remy_g advice:)