【问题标题】:ForeignKey(unique=True) is usually better served by a OneToOneFieldForeignKey(unique=True) 通常由 OneToOneField 提供更好的服务
【发布时间】:2016-02-23 19:09:36
【问题描述】:
class Categories(models.Model):
    id = models.ForeignKey('auth.User',primary_key=True)
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=300)

    def __str__(self):
        return Categories.name

    class Meta:
        order_with_respect_to = 'id'


class Specializations(models.Model):
    id = models.ForeignKey('auth.User',primary_key=True)
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=300)
    categories = models.ForeignKey(Categories, on_delete=models.CASCADE)


    def __str__(self):
        return Specializations.name

courses.Categories.id: (fields.W342) 在 ForeignKey 上设置 unique=True 与使用 OneTo 的效果相同 一个字段。

    HINT: ForeignKey(unique=True) is usually better served by a OneToOneField.

courses.Courses.id: (fields.W342) 在 ForeignKey 上设置 unique=True 与使用 OneToOne 的效果相同 字段。

    HINT: ForeignKey(unique=True) is usually better served by a OneToOneField.

courses.Specializations.id: (fields.W342) 在 ForeignKey 上设置 unique=True 与使用 OneToOneField。

尽管关系是一对多,但仍会引发此警告或错误!不是一对一的

【问题讨论】:

    标签: django django-models makemigrations


    【解决方案1】:

    您设计模型的方式本质上是OneToOne 关系,因为您将ForeignKey 设置为primary_key(这会自动应用unique=True)。

    您真的希望用户成为CategoriesSpecializationsprimary_key 吗?

    我想你想要这样的东西:

    class Categories(models.Model):
        user = models.ForeignKey('auth.User')
        name = models.CharField(max_length=100)
        description = models.CharField(max_length=300)
    
        def __str__(self):
            return self.name
    
    
    class Specializations(models.Model):
        user = models.ForeignKey('auth.User')
        name = models.CharField(max_length=100)
        description = models.CharField(max_length=300)
        categories = models.ForeignKey(Categories, on_delete=models.CASCADE)
    
    
        def __str__(self):
            return self.name
    

    有了这个User可以有很多CategoriesSpecializations 我还把__str__方法改成了self.name

    【讨论】:

    • 错误:courses.Categories: (models.E004) 如果字段也设置了“primary_key=T rue”,则“id”只能用作字段名。并为所有表重复
    • 删除 id 字段。 Django 默认创建它们。 id 是 django 中的保留名称。您不能将其用作字段名称
    猜你喜欢
    • 2012-04-14
    • 2011-03-14
    • 2015-09-04
    • 2015-08-15
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多