【问题标题】:ForeignKey to a Model field?模型字段的外键?
【发布时间】:2016-04-24 19:54:12
【问题描述】:

我想在我的模型中使用User 表中的username 字段(存储使用django.contrib.auth.forms.UserCreationForm 创建的user)中的foreign key 关系。

这是我的模型的外观:

class Blog(models.Model):
    username = models.CharField(max_length=200) // this should be a foreign key
    blog_title = models.CharField(max_length=200)
    blog_content = models.TextField()

username 字段应该是外键。The Foreign Key should be with this field

【问题讨论】:

    标签: python django django-models django-users django-database


    【解决方案1】:

    字段不能有 ForeignKey,但可以有一行。

    您想要username,它可以通过User 模型获得

    所以:

    blog.user.username
    

    如果你坚持使用blog.username,你可以这样定义一个属性:

    from django.db import models
    from django.contrib.auth.models import User
    
    class Blog(models.Model):
        user = models.ForeignKey(User)
    

    然后访问您要使用的字段:

    blog.user.username
    

    如果你坚持使用blog.username,你可以这样定义一个属性:

    from django.db import models
    from django.contrib.auth.models import User
    
    class Blog(models.Model):
        user = models.ForeignKey(User)
    
        @property
        def username(self):
            return self.user.username
    

    使用该属性,您可以通过blog.username 访问username

    关于如何导入用户的注意事项

    user = ForeignKey('auth.User')
    

    from django.contrib.auth.models import User
    user = ForeignKey(User)
    

    或更多推荐

    from django.conf import settings
    user = ForeignKey(settings.AUTH_USER_MODEL)
    

    【讨论】:

    • 正是我想要的。
    • 你能告诉我是否还必须在此处导入任何类。
    • ModelForeignKey 来自您已经导入的 Django 的 models,而 property 装饰器是 Python 内置的,所以没有。
    • User 我创建的模型。如果是这样,那么它不是我想要的。
    • 它可以来自 Django 或者你自己的自定义 User 模型(在这种情况下你可以使用settings.AUTH_USER_MODEL 来引用它)
    【解决方案2】:

    除非我遗漏了什么,否则您可以拥有一个指向特定字段的外键:

    class Blog(models.Model):
        username = models.ForeignKey(User, to_field='username')
    

    https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ForeignKey.to_field

    【讨论】:

    • ... 除了“to_field”中的字段在表中必须是唯一的。所以一般情况下是行不通的。
    • @CS 唯一性约束如何“通常不起作用”?请注意,问题是关于“模型字段的外键”,正如我们所知,它确实必须是唯一的,因为这就是外键,“多对一关系”,意味着来自博客表与用户表中的“一个”记录相关。如果相关字段(用户名)不是唯一的,并且说有 3 条记录具有相同的值(例如 John123),那么就不可能将博客与用户相关联,因为用户有超过 1 条具有相同值的记录可供选择的字段值(用于用户名)。
    • @nponcian 你比我更详细地解释了我的观点,所以谢谢你。希望它能为其他读者澄清一些事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 2021-09-13
    • 2015-10-14
    • 2015-06-13
    • 2010-10-18
    • 1970-01-01
    • 2011-11-28
    相关资源
    最近更新 更多