kopia lustrzana https://github.com/djpeacher/django-projects
refactor(user_solo): made field more generic
I realized that this could apply to more use cases if it just offered a custom field.main
rodzic
859347a282
commit
0dc360b009
|
@ -1,22 +1,17 @@
|
||||||
# django-user-solo
|
# django-user-solo
|
||||||
|
|
||||||
Proof of concept `UserSingletonModel` that creates an singleton instance for each user.
|
Proof of concept `AutoOneToOneField` that creates an singleton instance for each user.
|
||||||
|
|
||||||
Inspired by [django-solo](https://github.com/lazybird/django-solo) ❤️
|
Inspired by [django-solo](https://github.com/lazybird/django-solo) ❤️
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from user_solo.models import UserSingletonModel
|
from user_solo.models import AutoOneToOneField
|
||||||
|
|
||||||
class Preference(UserSingletonModel):
|
class Preference(models.Model):
|
||||||
|
user = AutoOneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
|
||||||
flag = models.BooleanField(default=True)
|
flag = models.BooleanField(default=True)
|
||||||
|
|
||||||
# All users will have .preference
|
# All users will have .preference
|
||||||
user = User.objects.get(...)
|
user = User.objects.get(...)
|
||||||
user.preference # get_or_create
|
user.preference # get_or_create
|
||||||
```
|
```
|
||||||
|
|
||||||
### TODO
|
|
||||||
|
|
||||||
- Settings
|
|
||||||
- Caching
|
|
||||||
- Signals (create when user created)
|
|
||||||
|
|
|
@ -1,21 +1,13 @@
|
||||||
from django.conf import settings
|
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
from django.db import models
|
|
||||||
from django.db.models.fields.related_descriptors import ReverseOneToOneDescriptor
|
from django.db.models.fields.related_descriptors import ReverseOneToOneDescriptor
|
||||||
from django.db.models.fields.related import OneToOneField
|
from django.db.models.fields.related import OneToOneField
|
||||||
|
|
||||||
class UserSingletonDescriptor(ReverseOneToOneDescriptor):
|
class AutoReverseOneToOneDescriptor(ReverseOneToOneDescriptor):
|
||||||
def __get__(self, user, cls=None):
|
def __get__(self, user, cls=None):
|
||||||
try:
|
try:
|
||||||
return super().__get__(user, cls)
|
return super().__get__(user, cls)
|
||||||
except ObjectDoesNotExist:
|
except ObjectDoesNotExist:
|
||||||
return self.related.related_model.objects.create(user=user)
|
return self.related.related_model.objects.create(user=user)
|
||||||
|
|
||||||
class UserSingletonField(OneToOneField):
|
class AutoOneToOneField(OneToOneField):
|
||||||
related_accessor_class = UserSingletonDescriptor
|
related_accessor_class = AutoReverseOneToOneDescriptor
|
||||||
|
|
||||||
class UserSingletonModel(models.Model):
|
|
||||||
user = UserSingletonField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
abstract = True
|
|
Ładowanie…
Reference in New Issue