【问题标题】:Django Customize many to many queryDjango 自定义多对多查询
【发布时间】:2018-08-17 09:43:20
【问题描述】:

我通过将 ManyToManyField 添加到另一个名为 Algorithm 的表中来扩展 Django 的默认 User 类。新的用户类是:

class User(AbstractUser):

    name = CharField(_("Name of User"), blank=True, max_length=255)
    algorithms = ManyToManyField(Algorithm, blank=True, default=None, related_name="users")

    def get_absolute_url(self):
        return reverse("users:detail", kwargs={"username": self.username})

我想指定用户is_superuser 还是is_staff 然后User.algorithms.all() 将获得所有算法。否则,仅获取数据透视表User_user_models 中的记录。如何做到这一点?我尝试添加一个属性方法来检查是否超级用户/员工然后返回所有,否则返回超级但它不起作用。

P.S:在创建/编辑用户时,如果用户设置为超级用户或员工,则无需选择算法。

【问题讨论】:

  • 我会在这里创建一个自定义关系管理器。通常,覆盖默认的 Django 逻辑不是一个好主意。
  • 我认为这不应该是一个模型字段。这只是一种方法。您实际的 usr-alg 匹配项存储在与用户模型表 User_user_models 无关,对于特定用户,您根本不需要任何匹配项。
  • @WillemVanOnsem 你有如何做的例子吗?

标签: django python-3.x django-models


【解决方案1】:

我只想覆盖save() 方法:

class User(AbstractUser):

    name = CharField(_("Name of User"), blank=True, max_length=255)
    algorithms = ManyToManyField(Algorithm, blank=True, default=None, related_name="users")

    def get_absolute_url(self):
        return reverse("users:detail", kwargs={"username": self.username})

    def save(self, **kwargs):

         if self.is_superuser or self.is_staff:
             self.algorithms = Algorithm.objects.all()

         else:
             # Get your users from your pivot table

         super().save()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2010-11-26
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2011-09-09
    • 2021-11-14
    • 2011-08-03
    相关资源
    最近更新 更多