如果对象存在,我如何编辑它或创建 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.post
(CreateView
是ProcessFormView
的子类)以你的方式处理对象创建。
我想这是通用视图比自定义视图需要更多编码的情况之一。我会试试看会发生什么。
谢谢冷眼。我终于能够让它工作了。使用上面的代码而不是 form.save()。干杯。以上是关于如果对象存在,我如何编辑它或创建 Django 中不存在的对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何:创建一个视图和序列化器,用于添加,编辑和删除具有外部关系的对象django rest framework
django - 如果一个或多个字段不存在则不断言的 Q 对象