Django : получение данных из моделей
У меня серьезная проблема, мне нужно получить набор запросов из несвязанной модели
моя модель:
# 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 модели конкурса, но я не знаю, как это возможно
Если я правильно понял ваш вопрос, то, что вы пытаетесь сделать, невозможно в вашем текущем коде. Если вы хотите получить все объекты Submission
, отфильтрованные по определенному идентификатору Contest
, вам нужно соединить эти два объекта.
Например, вот пример того, каким должен быть вызов:
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, но в целом это должно вас устроить.
EDIT: (на основе контекста из ответа)
Поскольку вы не можете редактировать исходный код, вместо этого вы сделаете что-то вроде этого:
У вас есть соединение, которое идет от Contest (m2m) к Problem, и другое, которое идет от Submission обратно к Problem. Это то, что вы будете использовать.
Сначала у вас есть название конкурса, или id, или какой-то идентификатор. Вы получите этот объект.
contest = Contest.objects.get(name="contest name") # or id
Затем вы захватите все Представления, которые находятся в в contest.problems
. Что-то вроде:
submissions_by_contest = Submission.objects.filter(problem__in=contest.problems)
Синтаксис может немного отличаться, но именно такое соединение вы бы использовали.