我想使用CreateView通用视图创建一个不存在的对象,或者如果它存在则编辑它。我使用kwargs ['pk']从网址中捕获一个数字,找到使用该数字作为ID的餐馆。我使用request.user来找出哪个用户评价该餐馆。现在,用户可以评价他之前评价过的餐馆,并且每次提交评级时都可以在评级表中创建新记录。到目前为止,我已经提出以下建议。
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)
url(r'^restaurants/(?P<pk>[0-9]+)/rate/$', views.Rate.as_view()),
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()。我不知道,我很困惑。
答案 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中的新方法