繁体   English   中英

Django:从模型中检索数据

[英]Django : retrieve data from models

我有一个严重的问题,我需要从一个不相关的模型中检索一个查询集

我的模型:

# problem/models.py

User = get_user_model()

class Problem(models.Model):
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=1000)
    writer = models.ForeignKey(User,models.CASCADE)
    score = models.PositiveIntegerField(default=100) # my perfer is PositiveSmallIntegerField
    
class Submission(models.Model):
    submitted_time = models.DateTimeField(auto_now_add=True)
    participant = models.ForeignKey(User,related_name="submissions",on_delete=models.CASCADE)
    problem = models.ForeignKey(Problem,related_name="submissions",on_delete=models.CASCADE)
    code = models.URLField(max_length=200)
    score = models.PositiveIntegerField(default=0)
# contest/models.py

class Contest(models.Model):
    name = models.CharField(max_length=50)
    holder = models.ForeignKey(User, on_delete=models.CASCADE)
    start_time = models.DateTimeField()
    finish_time = models.DateTimeField()
    is_monetary = models.BooleanField(default=False)
    price = models.PositiveIntegerField(default=0)
    problems = models.ManyToManyField(Problem)
    authors = models.ManyToManyField(User, related_name='authors')
    participants = models.ManyToManyField(User, related_name='participants')

我试图检索这样的提交查询集

<QuerySet [<Submission: Submission object (12)>, <Submission: Submission object (6)>, <Submission: Submission object (16)>, <Submission: Submission object (5)>, <Submission: Submission object (11)>, <Submission: Submission object (15)>, <Submission: Submission object (14)>, <Submission: Submission object (4)>, <Submission: Submission object (10)>, <Submission: Submission object (9)>, <Submission: Submission object (3)>, <Submission: Submission object (8)>, <Submission: Submission object (2)>, <Submission: Submission object (13)>, <Submission: Submission object (1)>, <Submission: Submission object (7)>]>

使用竞赛模型的 id ,但我不知道这怎么可能

如果我正确理解了您的问题,那么在您当前的代码中,您尝试做的事情是不可能的。 如果您想拉回由特定Contest id 过滤的所有Submission对象,您需要将两者连接起来。

例如,下面是调用应该是什么的示例:

submissions_by_contest = Submission.object.filter(contest.id=123) # or whatever the id/pk field is on Contest

但是,为了使其工作,您必须将Submission模型修改为如下所示:

from contest.models import Contest

class Submission(models.Model):
    submitted_time = models.DateTimeField(auto_now_add=True)
    participant = models.ForeignKey(User,related_name="submissions",on_delete=models.CASCADE)
    problem = models.ForeignKey(Problem,related_name="submissions",on_delete=models.CASCADE)
    code = models.URLField(max_length=200)
    score = models.PositiveIntegerField(default=0)
    contest = models.ForeignKey(Contest,related_name="submissions")

这会将Submission模型连接回Contest作为contest

您可能需要根据文件所在的位置以及 pythonic 模块的子目录对其进行一些修改,但它通常应该能让您到达那里。

编辑:(基于回复的上下文)

由于您无法编辑初始代码,因此您将执行以下操作:

您有一个从竞赛 (m2m) 到问题的连接和另一个从提交返回到问题的连接。 这就是你将使用的。

首先,您有比赛名称或 ID 或一些标识符。 你会得到那个对象。

contest = Contest.objects.get(name="contest name") # or id

然后,您将获取contest.problems的所有提交。问题。 就像是:

submissions_by_contest = Submission.objects.filter(problem__in=contest.problems)

语法可能略有不同,但这是您要使用的连接。

暂无
暂无

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

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