在插入行时使用Django条件表达式

时间:2019-02-14 06:14:13

标签: django-models

我有以下模型-

class Review(BaseModel,EntityBaseClass):
    review  = models.TextField(null=True,blank=True)
    reviewer = models.ForeignKey(User, related_name='reviewer', null=True, on_delete=models.SET_NULL)
    anonymous_review = models.BooleanField(default=False)

我想要的是,如果我收到匿名= True的请求,则我不应该捕获用户详细信息,而只能捕获评论。

我想知道是否可以使用Django条件表达式来实现。 我尝试过-

user = request.user
Review.objects.create(review='some review', reviewer=Case(When(Q(params['anonymous_review']),then=user)), 
anonymous_review = Case(When(Q(params['anonymous_review']),then=Value('True')), default=Value('False')))

但是,用户对象被转换为字符串,因此我收到错误消息,说审阅者必须是用户对象实例。 有没有办法解决? Django条件表达式不应该这样使用吗?

1 个答案:

答案 0 :(得分:1)

有些人似乎忘记了Django的ORM只是关系数据库之上的一薄层,但是您显然明白了这一点-但恐怕您确实将它推得太远了;-)

您使用的表达式是用于复杂(选择)查询的SQL语法包装,它们不能替代基本的Python功能:

user = request.user

Review.objects.create(
    review='some review', 
    reviewer=user if user.is_authenticated else None, 
    anonymous_review=user.is_anonymous
    )