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
Jonathan Peacher 2023-06-27 10:22:34 -05:00
rodzic 859347a282
commit 0dc360b009
Nie znaleziono w bazie danych klucza dla tego podpisu
2 zmienionych plików z 7 dodań i 20 usunięć

Wyświetl plik

@ -1,22 +1,17 @@
# 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) ❤️
```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)
# All users will have .preference
user = User.objects.get(...)
user.preference # get_or_create
```
### TODO
- Settings
- Caching
- Signals (create when user created)

Wyświetl plik

@ -1,21 +1,13 @@
from django.conf import settings
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 import OneToOneField
class UserSingletonDescriptor(ReverseOneToOneDescriptor):
class AutoReverseOneToOneDescriptor(ReverseOneToOneDescriptor):
def __get__(self, user, cls=None):
try:
return super().__get__(user, cls)
except ObjectDoesNotExist:
return self.related.related_model.objects.create(user=user)
class UserSingletonField(OneToOneField):
related_accessor_class = UserSingletonDescriptor
class UserSingletonModel(models.Model):
user = UserSingletonField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
class Meta:
abstract = True
class AutoOneToOneField(OneToOneField):
related_accessor_class = AutoReverseOneToOneDescriptor