Многопользовательская модель Django

#python #django

#python #django

Вопрос:

Мне нужен совет по многопользовательскому типу.

Сценарий:

  • Пользователь может быть организацией, где в этой организации они могут размещать рекламу на веб-сайте. Владелец этой организации (пользователь) может редактировать / удалять пользователей и объявления своей собственной организации (группы). В этом типе пользователей организации есть пользователи, которые также могут входить в систему, и они могут видеть только размещенные ими объявления, но владелец этой группы должен видеть все свои собственные объявления и объявления своих пользователей. Представьте себе список недвижимости, в котором организация имеет несколько местоположений / пользователей, которые могут размещать объявления, и должна управляться пользователем-администратором этой организации.

Какой тип или модель являются лучшими / самыми чистыми для хорошей реализации этого? Нужна ли мне модель пользователя и группы Django?

Ответ №1:

Одним из решений было бы иметь структуру «Профили пользователей».

Итак, вы используете стандартную пользовательскую модель Django и привязываете к ней несколько отношений OneToOne в зависимости от количества типов профилей, которые у вас будут. Преимущество этого заключается в том, что пользователи могут выполнять более одной роли одновременно.

Например:

 from django.contrib.auth.models import User

class Organization(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="organization")
    name = models.CharField(max_length=50, blank=True, null=True)

class Supervisor(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="supervisor")
    name = models.CharField(max_length=50, blank=True, null=True)
    organization = models.ForeignKey(Organization, on_delete=models.CASCADE, related_name="supervisors")
    
class CustomUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="custom_user")
    name = models.CharField(max_length=50, blank=True, null=True)
    supervisor = models.ForeignKey(Supervisor, on_delete=models.CASCADE, related_name="custom_users", blank=True, null=True)
 

А затем, когда вы идете и создаете модели для показа рекламы на веб-сайте, вы можете использовать встроенный PermissionRequiredMixin.

Для этого вам нужно начать с добавления «разрешений» в мета-класс модели ad:

 class Ad(models.Model):
# fields

class Meta:
    permissions = [
        ('can_edit_ads', 'org_representative')
    ]
 

Затем, на ваш взгляд, вы должны расширить PermissionRequiredMixin, например:

 class EditAd(UpdateView, PermissionRequiredMixin):
    model = Ad
    template_name = "ad123.html"
    permission_required = "ad.can_edit_ads"
 

Быстрый способ протестировать ее — зайти в таблицу пользователей на панели администратора, открыть страницу сведений о пользователе, где вы можете увидеть все разрешения, и там наряду с другими вы также найдете свой собственный.
Оттуда вы можете легко назначить новое разрешение конкретному пользователю.