【问题标题】:Inheriting a field from a model in django从 django 中的模型继承字段
【发布时间】:2020-06-25 17:32:15
【问题描述】:

我希望我的 Comments 模型中的 user_image、email 和 name 字段继承自 UserProfile 模型。我尝试在我的 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)

【问题讨论】:

  • 实际上继承 AbstractUser 类只是为了提供用户资料信息是个坏主意。只需创建名为 UserProfile 的新模型(不要触摸 AbstractUser),并使 OneToOneField 指向 User 模型。在这里阅读更多:simpleisbetterthancomplex.com/tutorial/2016/11/23/…

标签: django django-models


【解决方案1】:

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

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)

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

这有删除重复数据的优点,但是如果用户更改了他们的电子邮件或其他信息,它也会“追溯”更改为 cmets。如果你想避免这种情况,最好只是将数据复制到模型上的类似字段中(但也要保留 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 = ...

【讨论】:

  • 第二个选项对我来说感觉很好,但只是为了询问,我是否可以像你的第二个例子一样这样做:user_profile_image = user.profile_image
  • 那行不通。它没有将 profile_image 识别为用户对象的字段。
  • 哦,我以为你是指分配的时候。你可以也许使用user_profile_image = User._meta.get_field("profile_image")之类的东西,但你最好只复制字段。
猜你喜欢
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 2022-10-24
  • 1970-01-01
  • 2012-09-27
相关资源
最近更新 更多