在Django中,queryset提供了一个名为get_or_create的方法,该方法可以返回对象或创建对象.
但是,与get方法一样,如果查询返回多个对象,get_or_create可能会抛出异常.
有没有一种方法可以优雅地做到这一点:
objects = Model.manager.filter(params)
if len(objects) == 0:
obj = Model.objects.create(params)
else:
obj = objects[0]
Run Code Online (Sandbox Code Playgroud) 我有2个型号分类和项目.项目引用了类别.
class Category(models.Model):
name = models.CharField(max_length=32)
class Item(model.Models):
name = models.CharField(max_length=32)
category = models.ForeignKey(Category)
sequence = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
序列字段应该捕获类别中Item的序列.
我的问题是:我需要在类别和/或项目上设置什么元选项,以便在我这样做时:
category.item_set.all()
Run Code Online (Sandbox Code Playgroud)
我得到的项目按序列号排序.
PS:我现在知道一个名为ordering_with_respect_to的元选项..但它仍然不清楚它是如何工作的,而且我在序列列中也有遗留数据.如果正确的方法需要,我愿意接受数据迁移.
我在视图中有以下代码
page = get_object_or_404(Page, site = site, slug = slug)
pagecontents = PageContent.objects.filter(page=page)
pagecontents[0].description = form.cleaned_data['description']
pagecontents[0].save()
print pagecontents[0].description
print form.cleaned_data['description']
Run Code Online (Sandbox Code Playgroud)
当两个打印语句执行时,我得到以下内容
为线 print pagecontents[0].description
<p>Most important page</p>
Run Code Online (Sandbox Code Playgroud)
为线 form.cleaned_data['description']
<p>Least important page</p>
Run Code Online (Sandbox Code Playgroud)
为什么对象没有被保存?