Django:model类的objects属性

A model class's objects attribute is an instance of django.db.models.manager.Manager. A manager has the following methods, all of which return a QuerySet instance.

  • all() -- Returns a QuerySet of all objects in the database. This is like the old get_list(). Takes no arguments.
  • filter(**kwargs) -- Returns a QuerySet, filtered by the given keyword arguments. Lookup arguments are in the same style as previously, e.g. pubdate__year=2005, except you can leave off __exact as a convenience. For example, name='John' and name__exact='John' are equivalent. Note that for lookups between applications you can't omit __exact.
  • exclude(**kwargs) is the same as filter(), but returns objects where the given arguments are not true.
  • order_by(*fieldnames) -- Returns a QuerySet
  • count() -- Returns the count of all objects in the database.
  • dates(field_name, kind) -- Like the old get_FIELD_list() for date fields. For example, old-school get_pubdate_list('year') is now dates('pubdate', 'year').
  • delete() -- Deletes all objects.
  • distinct() -- Returns a QuerySet with DISTINCT set.
  • extra(select=None, where=None, params=None, tables=None) -- Sets the select, where, params and tables arguments, which are in the same format as before.
  • get(**kwargs) -- Like the old get_object(). Returns an object or raises DoesNotExist on error.
  • in_bulk(id_list) -- Like the old get_in_bulk().
  • iterator() -- Returns a generator that iterators over results.
  • select_related() -- Returns a QuerySet with the "select related" option (which acts the same as before) set.
  • values(*fieldnames) -- Like the old get_values().

Each QuerySet has the following methods, which return a clone of the query set with the appropriate changes made:

  • filter(**kwargs)
  • order_by(*fieldnames)
  • iterator()
  • count()
  • get(**kwargs)
  • delete()
  • filter(**kwargs)
  • select_related()
  • order_by(*fieldnames)
  • distinct()
  • extra(select=None, where=None, params=None, tables=None)

Here are some examples, which use the following models:

class Reporter(models.Model):
    fname = models.CharField(maxlength=30)
    lname = models.CharField(maxlength=30)

class Site(models.Model):
    name = models.CharField(maxlength=20)

class Article(models.Model):
    headline = models.CharField(maxlength=50)
    reporter = models.ForeignKey(Reporter)
    pub_date = models.DateField()


    sites = models.ManyToManyField(Site)
Old syntaxNew syntax
reporters.get_list()Reporter.objects.all()
reporters.get_list(fname__exact='John')Reporter.objects.filter(fname='John')
reporters.get_list(order_by=('-lname', 'fname'))Reporter.objects.order_by('-lname', 'fname')
reporters.get_list(fname__exact='John', order_by=('lname',))Reporter.objects.filter(fname='John').order_by('lname')
reporters.get_object(pk=3)Reporter.objects.get(pk=3)
reporters.get_object(complex=(Q(...)|Q(...)))Reporter.objects.get(Q(...)|Q(...))
reporters.get_object(fname__contains='John')Reporter.objects.get(fname__contains='John')
reporters.get_list(fname__ne='John')Reporter.objects.exclude(fname='John') (note that ne is no longer a valid lookup type)
(not previously possible)Reporter.objects.exclude(fname__contains='n')
reporters.get_list(distinct=True)Reporter.objects.distinct()
reporters.get_list(offset=10, limit=5)Reporter.objects.all()[10:15]
reporters.get_values()Reporter.objects.values()
reporters.get_in_bulk([1, 2])Reporter.objects.in_bulk([1, 2])
reporters.get_in_bulk([1, 2], fname__exact='John')Reporter.objects.filter(fname='John').in_bulk([1, 2])
Date lookup 
articles.get_pub_date_list('year')Article.objects.dates('pub_date', 'year')
Latest-object lookup 
articles.get_latest() (required get_latest_by in model)Article.objects.latest() (with get_latest_by in model)
(Not previously possible)Article.objects.latest('pub_date') # Latest by pub_date (overrides get_latest_by field in model)
Many-to-one related lookup 
article_obj.reporter_idarticle_obj.reporter.id
article_obj.get_reporter()article_obj.reporter
reporter_obj.get_article_list()reporter_obj.article_set.all()
reporter_obj.get_article_list(headline__exact='Hello')reporter_obj.article_set.filter(headline='Hello')
reporter_obj.get_article_count()reporter_obj.article_set.count()
reporter_obj.add_article(headline='Foo')reporter_obj.article_set.create(headline='Foo')
(Alternate syntax)reporter_obj.article_set.add(article_obj)
("values" lookup, etc., not previously possible)reporter_obj.article_set.values()
Many-to-many related lookup 
article_obj.get_site_list()article_obj.sites.all()
article_obj.set_sites([s1.id, s2.id])article_obj.sites.clear(); article_obj.sites.add(s1); article_obj.sites.add(s2)
article_obj.set_sites([s1.id]) # deletionarticle_obj.sites.remove(s2)
site_obj.get_article_list()site_obj.article_set.all()

Note that related-object lookup uses the default manager of the related object, which means the API for accessing related objects is completely consistent with the API for accessing objects via a manager.

Also note that managers can't be accessed from instances:

p = Person.objects.get(pk=1)
p.objects.all() # Raises AttributeError

Override default manager name ('objects')

If a model already has an objects attribute, you'll need to specify an alternate name for the objects manager.

class Person(models.Model):
    first_name = models.CharField(maxlength=30)
    last_name = models.CharField(maxlength=30)
    objects = models.TextField()
    people = models.Manager()

p = Person(first_name='Mary', last_name='Jones', objects='Hello there.')
p.save()
p.objects == 'Hello there.'
Person.people.all()


原文链接:

http://hi.baidu.com/javalang/blog/item/7dd63c9bbf571db1c8eaf437.html

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django框架中,Model的一个重要属性objectsobjectsModel的默认Manager,它提供了许多用于与数据库交互的方法,如all()、filter()、get()、create()、update()等。 objects的作用是管理Model实例的创建、读取、更新和删除。它是Django ORM的核心部分,可以让我们通过Python代码来操作数据库。 使用objects,我们可以很方便地进行数据库操作,例如: - 获取所有的Model实例:MyModel.objects.all() - 根据条件查询Model实例:MyModel.objects.filter(name='John') - 创建新的Model实例:MyModel.objects.create(name='John', age=20) - 更新Model实例:MyModel.objects.filter(name='John').update(age=21) - 删除Model实例:MyModel.objects.filter(name='John').delete() 在Django中,我们可以使用自定义Manager来扩展objects的功能。我们可以在Model中定义一个Manager类,并在其中定义自己的方法,以便更好地管理Model实例。例如: ``` class MyModelManager(models.Manager): def get_by_name(self, name): return self.filter(name=name) class MyModel(models.Model): name = models.CharField(max_length=50) age = models.IntegerField() objects = MyModelManager() ``` 在这个例子中,我们定义了一个名为MyModelManager的自定义Manager,并在其中添加了一个get_by_name方法,用于根据名字查询Model实例。然后我们将这个自定义Manager赋值给Modelobjects属性,这样我们就可以使用MyModel.objects.get_by_name('John')来查询名字为John的Model实例了。 总之,objectsDjango框架中非常重要的一个属性,它提供了许多用于与数据库交互的方法,方便我们进行数据操作。同时,我们也可以通过自定义Manager来扩展objects的功能,以便更好地管理Model实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值