首页 > 解决方案 > 从 django 中的模型继承字段

问题描述

我希望从 UserProfile 模型继承我的 Comments 模型中的 user_image、email 和 name 字段。我尝试在我的 ForeignKey 字段中使用 UserProfile.profile_image 作为基类,但它显然没有用。我知道这是错误的,但任何替代方案都可以。

class UserProfile(AbstractUser):
    username = None
    bio = models.TextField(null=True, blank=True)
    profile_image = models.FileField(upload_to="profile_pic", blank=True, null=True)
    USERNAME_FIELD = 'email'

    def __str__(self):
        return self.email
class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments', null=True)
    name = models.CharField(max_length=150)
    user_image = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
    email = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
    body = models.TextField()
    created_date = models.DateTimeField(auto_now_add=True)
    active = models.BooleanField(default=False)

    class Meta:
        ordering = ['created_date']

    def __str__(self):
        return '{} comment made by {}'.format(self.body, self.name)

标签: djangodjango-models

解决方案


如果您想将每个评论与用户相关联,只需

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments', null=True)
    user = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
    # ...

    def __str__(self):
        return '{} comment made by {}'.format(self.body, self.user)

然后,您可以使用 etc. 访问用户的图像comment.user.profile_image等。

这具有删除重复数据的优势,但如果用户更改了他们的电子邮件或其他信息,它也会“追溯”更改为评论。如果您想避免这种情况,最好将数据复制到模型上的类似字段中(但也要保留该user字段,以用于簿记目的):

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments', null=True)
    user = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
    user_profile_image = models.FileField(upload_to="profile_pic", blank=True, null=True)
    user_email = ...

推荐阅读