[英]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.