如何将用户模型引用到我的应用模型并提供外键

时间:2018-02-21 14:18:18

标签: python django django-models django-views django-allauth

我正在使用 Django-Cookiecutter 使用 Django-Allauth 来处理所有身份验证,并且安装了一个名为 user 的应用程序处理与注册,退出等用户相关的所有内容。

我正在为用户分享models.py文件

@python_2_unicode_compatible
class User(AbstractUser):

    # First Name and Last Name do not cover name patterns
    # around the globe.
    name = models.CharField(_('Name of User'), blank=True, max_length=255)

    def __str__(self):
        return self.username

    def get_absolute_url(self):
        return reverse('users:detail', kwargs={'username': self.username})

现在我添加了我的新应用程序说课程和我的models.py是

class Course(models.Model):
    name = models.CharField(max_length=30)
    description = models.CharField(max_length=100)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("details:assess", kwargs={"id": self.id})

我还将views.py定义为

@login_required
def course_list(request):
    queryset = queryset = Course.objects.all()
    print("query set value is", queryset)
    context = {
             "object_list" :queryset,
              }

return render(request, "course_details/Course_details.html", context)

我有什么方法可以引用(外键)用户应用到我的课程应用,以便每个用户都分配了自己的课程。

其中一种可能的方法是根据用户过滤对象并将其传递给模板

我无法弄清楚如何映射用户和课程以获取分配给特定用户的课程列表。

2 个答案:

答案 0 :(得分:1)

除非您只为一个用户提供课程,否则在用户和课程模型之间建立一对多的关系是没有意义的。所以,你需要一个多对多的关系。通过创建UserProfile模型并将UserProfile与您的课程相关联来扩展用户模型也是明智之举。您可以查看here以了解如何扩展用户模型。

所以,你真正应该做的是:

class Course(models.Model):
    name = models.CharField(max_length=30)
    description = models.CharField(max_length=100)

    # Make sure you first import UserProfile model before referring to it
    students = models.ManyToManyField(UserProfile, related_name = 'courses')

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("details:assess", kwargs={"id": self.id})

另外,请注意添加和查询多对多关系几乎没有什么不同。有关详细信息,请参阅the docs

答案 1 :(得分:0)

您可以直接将外键添加为:

//Create an instance variable to track how many times the timer has fired.
var count: Int = 0


count = 0 //Reset the count so we start at 0 every time we trigger a timer.
Timer.scheduledTimer(withTimeInterval: 1.0 repeats: true block) { timer in
  self.count += 1
  if count == 2 {
    //your action code
  } else if count == 3 {
    //your other action code
  } else if count >= 4 {
    timer.invalidate()
  }