https://github.com/druids/django-generic-m2m-field
https://github.com/druids/django-generic-m2m-field
Last synced: about 1 year ago
JSON representation
- Host: GitHub
- URL: https://github.com/druids/django-generic-m2m-field
- Owner: druids
- License: mit
- Created: 2020-02-03T15:26:49.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2023-01-03T12:49:15.000Z (over 3 years ago)
- Last Synced: 2025-04-03T16:07:53.687Z (over 1 year ago)
- Language: Python
- Size: 27.3 KB
- Stars: 6
- Watchers: 3
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
Prolog
======
`Django-generic-m2m-field` extends the Django framework with a `GenericManyToManyField`. The field is similar to the standard `ManyToManyField` but uses Django's `GenericForeignKey` to relate to many different models.
Installation
------------
- Install `django-generic-m2m-field` with the `pip` command:
```bash
pip install django-generic-m2m-field
```
- Add `'generic_m2m_field'` to your `INSTALLED_APPS`:
```python
INSTALLED_APPS = [
# Django apps...
'generic_m2m_field',
]
```
Usage
-----
Imagine having an e-mail message log model where you need to relate more of different kinds of objects to the message:
```python
from django.db import models
from generic_m2m_field.models import GenericManyToManyField
class EmailMessage(models.Model):
recipient = models.EmailField(verbose_name=_('recipient'), blank=False, null=False)
sender = models.EmailField(verbose_name=_('sender'), blank=False, null=False)
subject = models.TextField(verbose_name=_('subject'), blank=False, null=False)
related_objects = GenericManyToManyField()
```
Now you can join your `EmailMessage` instance with any instance of any other model (User in this example):
```python
from django.contrib.auth.models import User
user1, user2 = User.objects.all()
email_message = EmailMessage.objects.first()
# Add user1 and user2
email_message.related_objects.add(user1)
email_message.related_objects.add(user1, user2)
# Remove user2
email_message.related_objects.remove(user2)
# Clear all relations
email_message.related_objects.clear()
# Set relations
email_message.related_objects.set(user2)
# Get all related object pks of User model (casted to right type)
email_message.related_objects.get_object_pks(User)
# Get all related object pks of User model
email_message.related_objects.get_objects(User)
```
Multiple DB
-----------
Django doesn't support foreign key for multiple databases. If you want to use generic m2m relation for models stored in different databases you can use ``MultipleDBGenericManyToManyField`` with the same way as GenericManyToManyField
```python
from django.db import models
from generic_m2m_field.models import MultipleDBGenericManyToManyField
class EmailMessage(models.Model):
recipient = models.EmailField(verbose_name=_('recipient'), blank=False, null=False)
sender = models.EmailField(verbose_name=_('sender'), blank=False, null=False)
subject = models.TextField(verbose_name=_('subject'), blank=False, null=False)
related_objects = MultipleDBGenericManyToManyField()
```
Named generic m2m field DB
--------------------------
Sometimes you want to name your relations. You can use ``NamedGenericManyToManyField`` for this purpose.
```python
from django.db import models
from generic_m2m_field.models import NamedGenericManyToManyField
class EmailMessage(models.Model):
recipient = models.EmailField(verbose_name=_('recipient'), blank=False, null=False)
sender = models.EmailField(verbose_name=_('sender'), blank=False, null=False)
subject = models.TextField(verbose_name=_('subject'), blank=False, null=False)
related_objects = NamedGenericManyToManyField()
```
Now you can set relations with names:
```python
from django.contrib.auth.models import User
user1, user2 = User.objects.all()
email_message = EmailMessage.objects.first()
# Add user1 and user2
email_message.related_objects.add(author=user1)
email_message.related_objects.add(watcher=user2)
# Read author and watcher
email_message.related_objects.author # return user1
email_message.related_objects.watcher # return user2
email_message.related_objects.to_dict() # return dict(author=user1, watcher=user2)
# Remove watcher
email_message.related_objects.remove(['watcher'])
# Clear all relations
email_message.related_objects.clear()
# Set relations
email_message.related_objects.set(author=user2)
```