Je construis une application Web Django où je veux deux choses :

  • Utilisez le modèle utilisateur intégré de Django pour l'utilisation de l'application d'administration de Django (propriétaire du magasin)
  • Utilisez Token Auth de DRF sur un modèle d'utilisateur personnalisé que je nommerai "Client" (client du magasin)

Comment puis-je conserver les deux systèmes d'authentification aux fins indiquées ci-dessus. D'après ce que j'ai lu, tout le monde demande de remplacer le modèle User mais je ne veux pas le faire. Au lieu de cela, je veux garder les deux. Quelle stratégie dois-je adopter ?

PS : C'est peut-être moi, mais je ne trouve aucune solution à cela dans la documentation de DRF. S'il y en a, merci de m'indiquer la bonne direction.

0
CaptArav 11 nov. 2020 à 20:23

1 réponse

Meilleure réponse

Django fournit une option pour utiliser un modèle utilisateur personnalisé. Mais vous pouvez avoir un et un seul modèle utilisateur.

Le processus est assez simple, créez votre propre modèle en héritant de django.contrib.auth.models.AbstractUser et spécifiez la variable de paramètres AUTH_USER_MODEL. L'administrateur Django fonctionne plutôt bien avec le concept de "modèle utilisateur personnalisé". Le modèle de jeton DRF utilise également la variable settings.AUTH_USER_MODEL pour sa relation OneToOne. Donc, cela peut être une solution viable.

Pour séparer les types d'utilisateurs, vous pouvez soit utiliser un champ char avec des choix représentant le type d'utilisateur, soit utiliser le mécanisme de groupes Django existant. Mais, dans les deux cas, vous ne pouviez toujours avoir qu'un seul modèle utilisateur.

Pour tout détail spécifique, vous pouvez avoir des relations OneToOne avec différents modèles stockant des informations supplémentaires.

Quelque chose comme ça ferait l'affaire,

from django.contrib.auth.models import AbstractUser
from model_utils.choices import Choices   # Useful package
from django.utils.functional import cached_property


class User(AbstractUser):
    USER_TYPES = Choices(
        ("store_owner", "Store Owner"),
        ("customer", "Customer"),
    )
    ...hack...
    user_type = models.CharField(choices=USER_TYPES)
    ...hack...

    @cached_property
    def is_store_owner(self):
        return (
            self.user_type == self.USER_TYPES.store_owner 
            and self.store_owner is not None
        )

    @cached_property
    def is_customer(self):
        return (
            self.user_type == self.USER_TYPES.customer 
            and self.customer is not None
        )


class StoreOwner(models.Model):
    user = models.OneToOneField(
        "yourapp.User", 
        related_name="store_owner",
    )
    # ...extra store owner details...


class Customer(models.Model):
    user = models.OneToOneField(
        "userapp.User",
        related_name="customer",
    )
    # ...extra customer details...

0
Dharman 11 nov. 2020 à 17:56