如何使用on_delete属性在用户模型的foreignkey字段中设置用户全名?

时间:2017-03-06 17:59:10

标签: python django django-models foreign-keys models

我在django中有一个带有用户模型的外键的模型。

class News(models.Model):
    user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.SET(???))
    message - models.TextField()

因此当从数据库中删除任何用户帐户时,在新闻表条目中也会根据用户删除。所以我希望当删除任何用户帐户时,我需要使用'on_delete=models.SET(???)'

在用户字段中设置他/她的全名
  

示例:

如果我有用户first_name =' Neeraj'和last_name =' Kumar' 当我想删除该用户帐户时,然后在新闻表中我想保存他的名字。

2 个答案:

答案 0 :(得分:10)

user模型中的

News字段映射到User模型实例。

您无法为此字段指定字符串。您只能为User模型实例分配null。

您必须提供替代用户来代替已删除的用户。因此要么保留用户进行替换,要么在删除时创建一个用户。在docs中非常清楚地解释了这一点。

您可以做的一件事是向name模型添加新的News字段,并在创建News实例时填充它。

class News(models.Mode):
    user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.SET_NULL)
    name = models.CharField()

    def save(self, *args, **kwargs):
        if not self.id:
            self.name = self.user.first_name + self.user.last_name
        super(News, self).save(*args, **kwargs)

现在删除User时,user字段设置为NULL,name字段包含所需的名称信息。

答案 1 :(得分:0)

与上一个答案一样,您无法将字符串值分配给ForeignKey字段。使用这种on_delete方法,您可以为此特殊用户分配类似已删除的内容。此外,如果您真的想将用户名分配到另一个字段,可以使用Django信号。使用on_delete无能为力。

from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import models

def get_sentinel_user():
    return get_user_model().objects.get_or_create(username='deleted')[0]

class MyModel(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET(get_sentinel_user),
    )