Contents Menu Expand Light mode Dark mode Auto light/dark, in light mode Auto light/dark, in dark mode Skip to content
GingerDJ 6.1.1 documentation
GingerDJ 6.1.1 documentation
  • GingerDJ documentation
  • Getting started
    • GingerDJ at a glance
    • Quick install guide
    • Writing your first GingerDJ app, part 1
    • Writing your first GingerDJ app, part 2
    • Writing your first GingerDJ app, part 3
    • Writing your first GingerDJ app, part 4
    • Writing your first GingerDJ app, part 5
    • Writing your first GingerDJ app, part 6
    • Writing your first GingerDJ app, part 7
    • Writing your first GingerDJ app, part 8
    • Advanced tutorial: How to write reusable apps
    • What to read next
  • Using GingerDJ
    • How to install GingerDJ
    • Models and databases
      • Models
      • Making queries
      • Aggregation
      • Search
      • Managers
      • Performing raw SQL queries
      • Database transactions
      • Multiple databases
      • Tablespaces
      • Database access optimization
      • Database instrumentation
      • Fixtures
      • Examples of model relationship API usage
        • Many-to-many relationships
        • Many-to-one relationships
        • One-to-one relationships
    • Handling HTTP requests
      • URL dispatcher
      • Writing views
      • View decorators
      • File Uploads
      • GingerDJ shortcut functions
      • Generic views
      • Middleware
      • How to use sessions
    • Working with forms
      • Formsets
      • Creating forms from models
      • Form Assets (the Media class)
    • Templates
    • Class-based views
      • Introduction to class-based views
      • Built-in class-based generic views
      • Form handling with class-based views
      • Using mixins with class-based views
    • Migrations
    • Managing files
    • Testing in GingerDJ
      • Writing and running tests
      • Testing tools
      • Advanced testing topics
    • GingerDJ’s cache framework
    • Conditional View Processing
    • Cryptographic signing
    • Sending email
    • Internationalization and localization
      • Translation
      • Format localization
      • Time zones
    • Logging
    • Pagination
    • Security in GingerDJ
    • Performance and optimization
    • Serializing GingerDJ objects
    • GingerDJ settings
    • Signals
    • System check framework
    • External packages
    • Asynchronous support
  • “How-to” guides
    • How to use GingerDJ’s CSRF protection
    • How to create custom gingerdj-admin commands
    • How to create custom model fields
    • How to write custom lookups
    • How to implement a custom template backend
    • How to create custom template tags and filters
    • How to write a custom storage class
    • How to deploy GingerDJ
      • How to deploy with WSGI
        • How to use GingerDJ with Gunicorn
        • How to use GingerDJ with uWSGI
        • How to use GingerDJ with Apache and mod_wsgi
      • How to deploy with ASGI
        • How to use GingerDJ with Daphne
        • How to use GingerDJ with Hypercorn
        • How to use GingerDJ with Uvicorn
      • Deployment checklist
    • How to upgrade GingerDJ to a newer version
    • How to manage error reporting
    • How to provide initial data for models
    • How to integrate GingerDJ with a legacy database
    • How to configure and use logging
    • How to create CSV output
    • How to create PDF files
    • How to override templates
    • How to manage static files (e.g. images, JavaScript, CSS)
    • How to deploy static files
    • How to install GingerDJ on Windows
    • How to create database migrations
    • How to delete a GingerDJ application
  • GingerDJ FAQ
    • FAQ: General
    • FAQ: Installation
    • FAQ: Using GingerDJ
    • FAQ: Databases and models
    • FAQ: The admin
    • Troubleshooting
  • API Reference
    • Applications
    • System check framework
    • Built-in class-based views API
      • Base views
      • Generic display views
      • Generic editing views
      • Generic date views
      • Class-based views mixins
        • Simple mixins
        • Single object mixins
        • Multiple object mixins
        • Editing mixins
        • Date-based mixins
      • Class-based generic views - flattened index
    • Clickjacking Protection
    • contrib packages
      • The GingerDJ admin site
        • Admin actions
        • ModelAdmin List Filters
        • The GingerDJ admin documentation generator
        • JavaScript customizations in the admin
      • The flatpages app
      • GeoGinger
        • GeoGinger Tutorial
        • GeoGinger Installation
          • Installing Geospatial libraries
          • Installing PostGIS
          • Installing SpatiaLite
        • GeoGinger Model API
        • GeoGinger Database API
        • GeoGinger Forms API
        • GIS QuerySet API Reference
        • Geographic Database Functions
        • Measurement Objects
        • GEOS API
        • GDAL API
        • Geolocation with GeoIP2
        • GeoGinger Utilities
          • LayerMapping data import utility
          • OGR Inspection
          • GeoJSON Serializer
        • GeoGinger Management Commands
        • GeoGinger’s admin site
        • Geographic Feeds
        • Geographic Sitemaps
        • Testing GeoGinger apps
        • Deploying GeoGinger
      • gingerdj.contrib.humanize
      • The messages framework
      • gingerdj.contrib.postgres
        • PostgreSQL specific aggregation functions
        • PostgreSQL specific database constraints
        • PostgreSQL specific query expressions
        • PostgreSQL specific model fields
        • PostgreSQL specific form fields and widgets
        • PostgreSQL specific database functions
        • PostgreSQL specific model indexes
        • PostgreSQL specific lookups
        • Database migration operations
        • Full text search
        • Validators
      • The redirects app
      • The sitemap framework
      • The “sites” framework
      • The staticfiles app
      • The syndication feed framework
    • Cross Site Request Forgery protection
    • Databases
    • gingerdj-admin and manage.py
    • Running management commands from your code
    • GingerDJ Exceptions
    • File handling
      • The File object
      • File storage API
      • Uploaded Files and Upload Handlers
    • Forms
      • The Forms API
      • Form fields
      • Model Form Functions
      • Formset Functions
      • The form rendering API
      • Widgets
      • Form and field validation
    • Logging
    • Middleware
    • Migration Operations
    • Models
      • Model field reference
      • Field attribute reference
      • Model index reference
      • Constraints reference
      • Model _meta API
      • Related objects reference
      • Model class reference
      • Model Meta options
      • Model instance reference
      • QuerySet API reference
      • Lookup API reference
      • Query Expressions
      • Conditional Expressions
      • Database Functions
    • Paginator
    • Request and response objects
    • SchemaEditor
    • Settings
    • Signals
    • Templates
      • The GingerDJ template language
      • Built-in template tags and filters
      • The GingerDJ template language: for Python programmers
    • TemplateResponse and SimpleTemplateResponse
    • Unicode data
    • gingerdj.urls utility functions
    • gingerdj.urls functions for use in URLconfs
    • gingerdj.conf.urls functions for use in URLconfs
    • GingerDJ Utils
    • Validators
    • Built-in Views
  • Meta-documentation and miscellany
    • API stability
    • Design philosophies
  • Glossary
Back to top
View this page

Related objects reference¶

class RelatedManager¶

A “related manager” is a manager used in a one-to-many or many-to-many related context. This happens in two cases:

  • The “other side” of a ForeignKey relation. That is:

    from gingerdj.db import models
    
    
    class Blog(models.Model):
        # ...
        pass
    
    
    class Entry(models.Model):
        blog = models.ForeignKey(Blog, on_delete=models.CASCADE, null=True)
    

    In the above example, the methods below will be available on the manager blog.entry_set.

  • Both sides of a ManyToManyField relation

    class Topping(models.Model):
        # ...
        pass
    
    
    class Pizza(models.Model):
        toppings = models.ManyToManyField(Topping)
    

    In this example, the methods below will be available both on topping.pizza_set and on pizza.toppings.

add(*objs, bulk=True, through_defaults=None)¶
aadd(*objs, bulk=True, through_defaults=None)¶

Asynchronous version: aadd

Adds the specified model objects to the related object set.

Example:

>>> b = Blog.objects.get(id=1)
>>> e = Entry.objects.get(id=234)
>>> b.entry_set.add(e)  # Associates Entry e with Blog b.

In the example above, in the case of a ForeignKey relationship, QuerySet.update() is used to perform the update. This requires the objects to already be saved.

You can use the bulk=False argument to instead have the related manager perform the update by calling e.save().

Using add() with a many-to-many relationship, however, will not call any save() methods (the bulk argument doesn’t exist), but rather create the relationships using QuerySet.bulk_create(). If you need to execute some custom logic when a relationship is created, listen to the m2m_changed signal, which will trigger pre_add and post_add actions.

Using add() on a relation that already exists won’t duplicate the relation, but it will still trigger signals.

For many-to-many relationships add() accepts either model instances or field values, normally primary keys, as the *objs argument.

Use the through_defaults argument to specify values for the new intermediate model instance(s), if needed. You can use callables as values in the through_defaults dictionary and they will be evaluated once before creating any intermediate instance(s).

create(through_defaults=None, **kwargs)¶
acreate(through_defaults=None, **kwargs)¶

Asynchronous version: acreate

Creates a new object, saves it and puts it in the related object set. Returns the newly created object:

>>> b = Blog.objects.get(id=1)
>>> e = b.entry_set.create(
...     headline="Hello", body_text="Hi", pub_date=datetime.date(2005, 1, 1)
... )

# No need to call e.save() at this point -- it's already been saved.

This is equivalent to (but simpler than):

>>> b = Blog.objects.get(id=1)
>>> e = Entry(blog=b, headline="Hello", body_text="Hi", pub_date=datetime.date(2005, 1, 1))
>>> e.save(force_insert=True)

Note that there’s no need to specify the keyword argument of the model that defines the relationship. In the above example, we don’t pass the parameter blog to create(). GingerDJ figures out that the new Entry object’s blog field should be set to b.

Use the through_defaults argument to specify values for the new intermediate model instance, if needed. You can use callables as values in the through_defaults dictionary.

remove(*objs, bulk=True)¶
aremove(*objs, bulk=True)¶

Asynchronous version: aremove

Removes the specified model objects from the related object set:

>>> b = Blog.objects.get(id=1)
>>> e = Entry.objects.get(id=234)
>>> b.entry_set.remove(e)  # Disassociates Entry e from Blog b.

Similar to add(), e.save() is called in the example above to perform the update. Using remove() with a many-to-many relationship, however, will delete the relationships using QuerySet.delete() which means no model save() methods are called; listen to the m2m_changed signal if you wish to execute custom code when a relationship is deleted.

For many-to-many relationships remove() accepts either model instances or field values, normally primary keys, as the *objs argument.

For ForeignKey objects, this method only exists if null=True. If the related field can’t be set to None (NULL), then an object can’t be removed from a relation without being added to another. In the above example, removing e from b.entry_set() is equivalent to doing e.blog = None, and because the blog ForeignKey doesn’t have null=True, this is invalid.

For ForeignKey objects, this method accepts a bulk argument to control how to perform the operation. If True (the default), QuerySet.update() is used. If bulk=False, the save() method of each individual model instance is called instead. This triggers the pre_save and post_save signals and comes at the expense of performance.

For many-to-many relationships, the bulk keyword argument doesn’t exist.

clear(bulk=True)¶
aclear(bulk=True)¶

Asynchronous version: aclear

Removes all objects from the related object set:

>>> b = Blog.objects.get(id=1)
>>> b.entry_set.clear()

Note this doesn’t delete the related objects – it just disassociates them.

Just like remove(), clear() is only available on ForeignKeys where null=True and it also accepts the bulk keyword argument.

For many-to-many relationships, the bulk keyword argument doesn’t exist.

set(objs, bulk=True, clear=False, through_defaults=None)¶
aset(objs, bulk=True, clear=False, through_defaults=None)¶

Asynchronous version: aset

Replace the set of related objects:

>>> new_list = [obj1, obj2, obj3]
>>> e.related_set.set(new_list)

This method accepts a clear argument to control how to perform the operation. If False (the default), the elements missing from the new set are removed using remove() and only the new ones are added. If clear=True, the clear() method is called instead and the whole set is added at once.

For ForeignKey objects, the bulk argument is passed on to add() and remove().

For many-to-many relationships, the bulk keyword argument doesn’t exist.

Note that since set() is a compound operation, it is subject to race conditions. For instance, new objects may be added to the database in between the call to clear() and the call to add().

For many-to-many relationships set() accepts a list of either model instances or field values, normally primary keys, as the objs argument.

Use the through_defaults argument to specify values for the new intermediate model instance(s), if needed. You can use callables as values in the through_defaults dictionary and they will be evaluated once before creating any intermediate instance(s).

Note

Note that add(), aadd(), create(), acreate(), remove(), aremove(), clear(), aclear(), set(), and aset() all apply database changes immediately for all types of related fields. In other words, there is no need to call save()/asave() on either end of the relationship.

If you use prefetch_related(), the add(), aadd(), remove(), aremove(), clear(), aclear(), set(), and aset() methods clear the prefetched cache.

Next
Model class reference
Previous
Model _meta API
Copyright © Ginger Society and contributors
Made with Sphinx and @pradyunsg's Furo
Last updated on Dec 14, 2024