繁体   English   中英

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

[英]Issues with figuring out Django ORM, what would be the correct way to query an inner join?

这是我第一次使用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_obj.ban_set.all()以获取用户的所有禁令。

_set是您访问Django中反向外键字段的方式,请参阅doc

顺便说一句,模型名称应为单一形式,而不是复数形式,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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM