gpt4 book ai didi

Django:使用模型查询多个表

转载 作者:行者123 更新时间:2023-12-02 00:54:57 26 4
gpt4 key购买 nike

我当前想要运行一个 SQL 语句来过滤我的数据库,但它访问多个表。从我在该网站上读到的其他示例来看,它们都使用外键而不是主键;然而,这是我当前的设置。我遇到两个问题,第一个问题是 SQL 过滤器。这些是我的模型:

class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True);

isATutor = models.BooleanField();
timeAvailable = models.CharField(max_length=3);

class TutorProfile(models.Model):
user = models.ForeignKey(User);

language = models.CharField(max_length=30);
unique_together = (("user", "language"), );

class Tutor(models.Model):
user = models.ForeignKey(User);

subject = models.CharField(max_length=30);
unique_together = (("user", "subject"), );

我目前正在使用原始 SQL。

def sqlQuery(avail, lang, sub):
from django.db import connection, transaction
cursor = connection.cursor();

cursor.execute("SELECT a.first_name, a.last_name, a.email FROM auth_user a, books_tutor b, books_tutorprofile c, books_userprofile d WHERE a.id = b.user_id AND a.id = c.user_id AND a.id = d.user_id AND b.subject=%s AND c.language=%s AND d.timeAvailable=%s", [sub, lang, avail]);
row = cursor.fetchall();

return row;

timeAvailable 采用三个字符串,格式为“MAE”,其中 M = 上午,A=下午,E=晚上,如果不需要,我们将替换为 - 例如“M--”仅在早上可用。

所以第一个问题是我希望能够将上述 SQL 保留为 django 模型。第二个问题是我需要一种查询 MAE 的好方法。我想我可能必须执行 8 个不同的 SQL 部分,并根据选择的内容对它们进行 UNION。

谢谢

史蒂夫

最佳答案

为什么不使用子类化?

class UserProfile(User):
time_available = models.CharField(max_length=3);

class Tutor(UserProfile):
subject = models.CharField(max_length=30);

class TutorProfile(Tutor):
language = models.CharField(max_length=30);
class Meta:
unique_together = ['username','subject','language'] # <--- username field from User base class.
  • UserProfile 有权访问所有用户字段以及 time_available。
  • 导师有权访问所有用户、用户个人资料字段以及主题。
  • TutorProfile 有权访问所有用户、用户个人资料和导师字段以及语言。

这样,您只需查找TutorProfile的实例即可实现连接。

我应该提到,当使用子类化时,会自动从子类到父类(super class)创建一个 OneToOneField。

关于Django:使用模型查询多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4211501/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com