代码之家  ›  专栏  ›  技术社区  ›  Dan

Django中作为外键的用户

  •  3
  • Dan  · 技术社区  · 6 年前

    我的模型中有以下内容。py文件:

    class Film(models.Model):
        title = models.CharField(max_length=200)
        director = models.CharField(max_length=200)
        description = models.CharField(max_length=200)
        pub_date = models.DateField('date published')
    
    class Comment(models.Model):
        film = models.ForeignKey(Film, on_delete=models.CASCADE)
        body = models.CharField(max_length=200)
    

    当我登录Django admin时,我添加了一些电影,然后添加了一些评论,选择与评论相关的电影对象。然后,我还通过管理面板创建了几个用户。

    我希望我的关系是:

    电影可以有很多评论/属于电影的评论

    用户可以有许多评论/属于用户的评论

    我想,就像评论和电影一样,我只需要定义 user 作为外键 comment . 我正在努力做到这一点。我正在通过 Django tutorials 但我看不到有关如何将其他表链接到用户的教程。

    我想我可以这样做:

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    

    像这样导入用户时:

    from django.contrib.auth.models import User
    

    现在的结果是如果我 user = models.ForeignKey(User, on_delete=models.CASCADE) I get err\u connection\u被拒绝

    2 回复  |  直到 2 年前
        1
  •  7
  •   Angel F    6 年前

    也许您已经在设置中更改了默认用户模型?

    而不是使用 User 直接使用外键,您应该使用 user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) 在您的评论模型中,如下所示

    class Comment(models.Model):
        film = models.ForeignKey(Film, on_delete=models.CASCADE)
        body = models.CharField(max_length=200)
        user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    

    您需要应用迁移才能将用户添加到注释, python manage.py makemigrations python manage.py migrate

    如果您正在应用迁移,shell会显示一条消息 您试图在没有默认值的情况下将不可为null的字段“user”添加到注释中

    您有2种选择

    1. 跳过迁移并在模型中的字段中添加默认值,或将属性设置为可为Null,无论您需要什么 ie

    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True, blank=True)

    并再次应用迁移

    1. 或为新字段选择默认值,该值应为数据库中现有用户的id

    这是因为django应该填充数据库中的现有记录(如果存在的话)

        2
  •  0
  •   Kai - Kazuya Ito    2 年前

    使用 “设置。AUTH\u USER\u模型” .

    所以,导入 “设置” 从…起 “django.conf” ,然后使用 “设置。AUTH\u USER\u模型” 如下所示:

    from django.db import models
    from django.conf import settings # Here
    
    class Comment(models.Model):
        film = models.ForeignKey(Film, on_delete=models.CASCADE)
        body = models.CharField(max_length=200)
                                # Here
        user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)