Django 导入模型与多个 ManyToManyFields() 的问题

0 投票
2 回答
931 浏览
提问于 2025-04-16 00:23

我正在用django创建一个简单的比赛提交系统。这是我第一次做真正的django项目。基本上,每个用户可以查看问题列表,提交文件,并查看结果页面。

每个问题可以关联多个比赛,而不同的比赛可以使用相同的问题。因此,问题和比赛之间有一个多对多的关系。这就是我遇到的问题所在。

这是我目前在models.py文件中的初步实现:

startfile

from django.db import models

class User(models.Model):

username = models.CharField(max_length=50)
firstname = models.CharField(max_length=50)
lastname = models.CharField(max_length=50)

class Problem(models.Model):

name = models.CharField(max_length=50)
filename = models.CharField(max_length=300)
contests = models.ManyToManyField(Contest)

class Contest(models.Model):

name = models.CharField(max_length=50)
problems = models.ManyToManyField(Problem)
date = models.DateField()

class Submission(models.Model):

user = models.ForeignKey(User)
problem = models.ForeignKey(Problem)
filename = models.CharField(max_length=300)

endfile

有没有简单的方法来解决这个问题?还是我应该重新考虑我的整个布局?我尝试把每个类分成自己的django应用,但我觉得这样做不太对。我遇到的错误是找不到Contest(因为它在文件中定义得比较低)。

非常感谢任何建议!

2 个回答

1

Django会自动为你创建反向关系,所以你只需要在一端创建它,比如说。

class Problem(models.Model):
    name = models.CharField(max_length=50)
    filename = models.CharField(max_length=300)
    contests = models.ManyToManyField(Contest, related_name='problems')

related_name让你可以给反向关系起个名字。如果你没有在Contest模型上定义这个关系,你仍然可以通过比如说a_contest.problems.all()来访问它!

2

在Contest和Problem这两个地方,你不需要都使用ManyToManyField。因为多对多的关系本身就是双向的。只要在其中一个地方加上就可以了,放在哪个地方都没关系。

撰写回答