2017-09-15 66 views
0

我有以下型号:Django模型的关系困惑

class UserPost(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) 
    post = models.ForeignKey(Post, on_delete=models.CASCADE) 
    created = models.DateTimeField(auto_now_add=True) 

class User(AbstractUser): 
    MALE = 'M' 
    FEMALE = 'F' 
    GENDER_CHOICES = (
     (MALE, 'Male'), 
     (FEMALE, 'Female') 
    ) 
    posts = models.ManyToManyField(Post, through='UserPost') 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 

class Post(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) 
    title = models.CharField(max_length=100) 
    content = models.TextField() 
    status = models.CharField(max_length=100) 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 

当我运行python manage.py makemigrations,它提出了以下错误:

users.User.posts:(fields.E303) 'User.posts'的反向查询名称与字段名称'Post.user'发生冲突。 提示:重命名字段'Post.user',或将字段'User.posts'的定义添加/更改related_name参数。

User和Post模型之间存在多对多关系。每个用户可以喜欢很多帖子,每个帖子都可以被许多用户喜欢。 用户和帖子模型之间也有多对一的关系。每个用户可以写很多帖子,每个帖子只能由一个用户写入。

默认情况下,不应该反向查询“User.posts”的名称为user_set。如果是这样,为什么这个名字与字段名'Post.user'冲突?有人可以解释这个错误的含义吗?谢谢。

回答

2

您需要UserPost型号吗?它看起来与Post有相同的字段,如果您经过有效的查询后,Django automatically creates database indexes on foreign keys。这里有一个简单的设置,应该工作得很好:

class User(AbstractUser): 
    # Your fields go here, but you might not need the posts field 

class Post(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='posts') 

这将让你做一个user.posts.all()让所有属于该userPost实例。

+0

嗨弗兰尼。您提供的示例解决了User和Post模型之间的一对多关系。但用户和帖子模型之间也存在多对多的关系(用户可以喜欢很多帖子,并且帖子可以被许多用户喜欢)。为了实现这种关系,我创建了UserPost,它是一个连接表。我的问题是为什么User.posts的反向查询名称(默认情况下应为user_set)与字段名称Post.user相冲突? –