如何编辑对象(如果存在)或创建Django中不存在的对象?

时间:2014-10-06 09:00:59

标签: python django generics view edit

我想使用CreateView通用视图创建一个不存在的对象,或者如果它存在则编辑它。我使用kwargs ['pk']从网址中捕获一个数字,找到使用该数字作为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)

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

1 个答案:

答案 0 :(得分: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中的新方法