Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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 Models - Fatal编程技术网

Python 在Django中使用一个类似内部联接的查询从多个表中获取值

Python 在Django中使用一个类似内部联接的查询从多个表中获取值,python,django,django-models,Python,Django,Django Models,我试图在Django创建一个简单的刽子手游戏。我有两个模型,一个用于单词列表,一个用于用户玩的游戏,它们之间定义了外键关系。这是模型定义: class WordMaster(models.Model): word = models.CharField("Secret Word", max_length=100) category = models.CharField("Category", max_length=20) sub_ca

我试图在Django创建一个简单的刽子手游戏。我有两个模型,一个用于单词列表,一个用于用户玩的游戏,它们之间定义了外键关系。这是模型定义:

class WordMaster(models.Model):
    word = models.CharField("Secret Word", max_length=100)
    category = models.CharField("Category", max_length=20)
    sub_category = models.CharField("Sub-category", max_length=50)

class GamesPlayed(models.Model):
    word_id = models.ForeignKey(WordMaster, on_delete=models.DO_NOTHING)
    guessed_letters = models.CharField("Guessed letters", max_length=72, null=True)
    guesses = models.IntegerField("Number of guesses", null=True)
    won = models.BooleanField("Won", null=True)
    start_time = models.DateTimeField("Started", auto_now=True, auto_now_add=False, null=True)
现在,当游戏进行时,我需要单词以及猜测的字母和猜测的次数

我将使用纯SQL执行此操作,如下所示:

SELECT * from gamesplayed gp
    JOIN wordmaster wm on gp.word_id = wm.id
    where gp.id = 5
然而,尽管我在许多地方进行了查找,但在Django ORM中仍未能找到等效的查询

因此,我最终使用了一个筛选查询,并在一个字典中得到了一个查询的结果,然后更新字典以添加来自另一个表的值。以下是我使用的代码:

g = GamesPlayed.objects.filter(pk=5)
game = list(g.values())[0]
game.update(list(WordMaster.objects.filter(pk=game['word_id_id']).values())[0])
但这似乎是一种相当多余的做事方式,原因有二:

  • 我无法使用模型中定义的关系
  • 如果我有3-4个如此相关的表,那么我必须对每个表逐一进行查询,这完全违背了ORM的目的

  • 那么有没有更好的方法呢?

    我不确定我是否正确理解了您的问题,但我认为您可能需要使用

    我使用了文档的例子,应用于您的案例

    以下是标准查找:

    # Hits the database.
    gp = GamesPlayed.objects.get(id=5)
    
    # Hits the database again to get the related `WordMaster` object.
    word_to_guess = gp.word_id.word
    
    下面是与select_相关的查找:

    # Hits the database.
    gp = GamesPlayed.objects.select_related('word_id').get(id=5)
    
    # Doesn't hit the database, because `gp.word_id` has been
    # prepopulated in the previous query.
    word_to_guess = gp.word_id.word
    

    这回答了你的问题吗?

    我建议将你的字段
    word\u id=models.ForeignKey(WordMaster,…)
    重命名为
    word\u master
    ,这样语义看起来更好/更容易理解。在您当前的代码中,您必须执行
    gp.word\u id.word
    (并且
    word\u id
    具有误导性,因为它实际上是一个相关对象,而不仅仅是一个id),重命名字段后,您将执行
    gp.word\u master.word
    (更清楚地显示它是一个相关对象)。谢谢,这很有效。有没有办法把所有的值都放在一本字典里?@gouravkr你能详细说明一下你希望在字典里有什么值吗。那么这个dict的键是什么呢?因为我只指定了一个id,所以它总是只返回一行。所以我想把两个表中的所有值都转换成一个dict,并将模型字段名作为键。但是我想我现在可以没有这个部分了,因为我理解了queryset的结构,并且能够在没有dict的情况下完成我的用例。