Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.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 ORM的问题是,查询内部联接的正确方法是什么?_Python_Mysql_Django_Orm - Fatal编程技术网

Python 找出Django ORM的问题是,查询内部联接的正确方法是什么?

Python 找出Django ORM的问题是,查询内部联接的正确方法是什么?,python,mysql,django,orm,Python,Mysql,Django,Orm,这是我第一次使用Django,到目前为止,我对框架的工作方式印象深刻。我目前正在开发我的第一个应用程序,处理数据库方面的事情。但是,我在弄清楚如何在不运行原始查询的情况下进行内部连接时遇到了一些问题 所以我有这个模型: class User(models.Model): id = models.IntegerField(null=False, primary_key=True) uuid = models.CharField(max_length=40, null=True)

这是我第一次使用Django,到目前为止,我对框架的工作方式印象深刻。我目前正在开发我的第一个应用程序,处理数据库方面的事情。但是,我在弄清楚如何在不运行原始查询的情况下进行内部连接时遇到了一些问题

所以我有这个模型:

class User(models.Model):
    id = models.IntegerField(null=False, primary_key=True) 
    uuid = models.CharField(max_length=40, null=True)
    username = models.CharField(max_length=17, null=True)
    balance = models.IntegerField(null=False, default=250)
    tokens = models.IntegerField(null=False, default=0)
    server = models.CharField(max_length=40, null=False, default="Hub")
    lastseen = models.DateTimeField(auto_now=False, auto_now_add=False, null=False, default="CURRENT_TIMESTAMP")


    def __str__(self):
        return 'id: %s, uuid: %s, username: %s, rank: %s, balance: %s, tokens: %s, server: %s, lastseen: %s' % (self.id, self.uuid, self.username, self.rank, self.balance, self.tokens, self.server, self.lastseen)

    class Meta:
        db_table = 'player_data'
这个模型获取了关于玩家的基本信息,但是我还需要获取关于玩家的信息,看看他们以前是否被禁止过,我通常使用raw的方式是在UUID上进行连接,这里是第二个模型

class Bans(models.Model):
    id = models.IntegerField(null=False, primary_key=True)
    uuid = models.ManyToManyField(User, db_column="uuid")
    class Meta:
        db_table = 'banned_players'

现在我真正需要做的就是使两个UUID跨表链接,我尝试了所有不同的Django方法,但遇到了问题,在这里最好做什么?如果按照实际的表本身来重命名模型会更好吗?

您仍然在使用关系数据库思维来设计django,我认为django不是这样工作的。除非确实需要,否则不应使用
uuid
链接两个模型。您应该只有:

class Ban(models.Model):
    # id is not redundant, django would define it for you
    # id = models.IntegerField(null=False, primary_key=True)
    user = models.ForeignKey(User)
然后执行
user\u obj.ban\u set.all()

\u set
是如何访问django中的reverse forignkey字段的,请查看


顺便说一句,模型名应该是单数形式,而不是复数形式,django会在必要时为您添加复数形式。

根据我的经验,使用MySQLdb进行连接更容易。Django ORM不适用于复杂联接

要安装MySQLdb,请执行以下操作:

$ gunzip MySQL-python-1.2.2.tar.gz
$ tar -xvf MySQL-python-1.2.2.tar
$ cd MySQL-python-1.2.2
$ python setup.py build
$ python setup.py install
要执行读取操作,请执行以下操作:

#!/usr/bin/python

import MySQLdb

# Open database connection
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = "SELECT * FROM EMPLOYEE \
       WHERE INCOME > '%d'" % (1000)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Fetch all the rows in a list of lists.
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
      # Now print fetched result
      print "fname=%s,lname=%s,age=%d,sex=%s,income=%d" % \
             (fname, lname, age, sex, income )
except:
   print "Error: unable to fecth data"

# disconnect from server
db.close()

在python shell中运行“user.ban_set.all()”时,它返回ForeignRelatedObjectsDescriptor对象没有属性all。我只需要能够使用用户模型中的UUID引用ban模型中的UUID
user
不是
user
模型中的对象。