如果对象存在,我如何编辑它或创建 Django 中不存在的对象?

Posted

技术标签:

【中文标题】如果对象存在,我如何编辑它或创建 Django 中不存在的对象?【英文标题】:How do I edit an object if it exist or create an object that doesn't exist in Django? 【发布时间】:2014-10-06 09:00:59 【问题描述】:

如果对象不存在,我想使用 CreateView 通用视图创建对象,如果存在则编辑它。我使用 kwargs['pk'] 从 url 中捕获一个数字,以使用该数字作为其 ID 来查找餐厅。我使用 request.user 来找出哪个用户正在评价那家餐厅。现在,用户可以对他之前评价过的餐厅进行评分,并且可以在每次提交评分时在评分表中创建新记录。到目前为止,我想出了以下内容。

views.py

class Rate(CreateView):
    model = Rating
    success_url = "/first/restaurants/%(restaurant_id)s/"
    fields = ['rating']

    def form_valid(self, form):
        form.instance.restaurant = Restaurant.objects.get(id=self.kwargs['pk'])
        form.instance.user = self.request.user
        return super(Rate, self).form_valid(form)

urls.py

url(r'^restaurants/(?P<pk>[0-9]+)/rate/$', views.Rate.as_view()),

models.py

class Rating(models.Model):
    restaurant = models.ForeignKey('Restaurant')
    user = models.ForeignKey(User)
    RESTAURANT_RATING_CHOICES = (
        (1, 'Poor'),
        (2, 'Unsatisfactory'),
        (3, 'Average'),
        (4, 'Good'),
        (5, 'Excellent'),
    )
    rating = models.IntegerField(default=3, choices=RESTAURANT_RATING_CHOICES)

如果用户再次对同一家餐厅进行评分,我不想创建新记录。相反,我想更新他之前对该餐厅的评分。我想我必须为我的 CreateView 类编写一个自定义的 get_object() 方法,或者使用 get_or_create() 之类的方法。我不知道,我很困惑。

【问题讨论】:

【参考方案1】:

也许您可以使用update_or_create 方法(此处描述为https://docs.djangoproject.com/en/dev/ref/models/querysets/#update-or-create)

类似这样的:

defaults = 'rating': 5
Rating.objects.update_or_create(restaurant_id=1, user_id=1, defaults=defaults)

如果这家餐厅的评分对象不存在,它将创建它。如果存在,评级将被更新。

注意:此方法是 django 1.7 中的新方法

【讨论】:

如何在我的 CreateView 类中实现这一点?还是我只需要创建一个普通视图? 如果您没有充分的理由使用通用视图,您可以编写自己的视图。但是如果你想使用泛型,你可以重写ProcessFormView.postCreateViewProcessFormView的子类)以你的方式处理对象创建。 我想这是通用视图比自定义视图需要更多编码的情况之一。我会试试看会发生什么。 谢谢冷眼。我终于能够让它工作了。使用上面的代码而不是 form.save()。干杯。

以上是关于如果对象存在,我如何编辑它或创建 Django 中不存在的对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何:创建一个视图和序列化器,用于添加,编辑和删除具有外部关系的对象django rest framework

创建 Django 模型或更新(如果存在)

在线协同代码编辑ide

django - 如果一个或多个字段不存在则不断言的 Q 对象

如何在 django 1.9 中删除 django-admin 中的保存并继续编辑按钮,使其不存在?

创建视图时如何执行 IF/ELSE 检查