【问题标题】:Query to extended user model returning error查询扩展用户模型返回错误
【发布时间】:2018-08-10 12:16:09
【问题描述】:

我在进行以下查询时收到错误消息:

Election.objects.all().exclude(candidate__UserID=request.user).filter(Gender=request.user.Profile.Gender).filter(CandidateReg=True)

到这个模型:

class Election(models.Model):
    Name = models.CharField(max_length=20)
    CandidateReg = models.BooleanField(default=True)
    VotingOpen = models.BooleanField(default=False)
    Description = models.CharField(max_length=255, null=True, blank=True)
    GENDERS = (("M","Male"), ("F","Female"))
    Gender = models.CharField(max_length=1, choices=GENDERS, default="M")
    Seats = models.IntegerField(default=7)
    FlipGrid = models.URLField(null=True, blank=True)
    Complete = models.BooleanField(default=False)

这个错误描述了问题:

Traceback (most recent call last):
      File "/home/elections/venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
        response = get_response(request)
      File "/home/elections/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
        response = self.process_exception_by_middleware(e, request)
      File "/home/elections/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
        response = wrapped_callback(request, *callback_args, **callback_kwargs)
      File "/home/elections/elections-real/elections/views.py", line 139, in add_candidate
        elections = Election.objects.all().exclude(candidate__UserID=request.user).filter(Gender=request.user.Profile.Gender).filter(CandidateReg=True)
      File "/home/elections/venv/lib/python3.6/site-packages/django/utils/functional.py", line 239, in inner
        return func(self._wrapped, *args)
    AttributeError: 'User' object has no attribute 'Profile'

似乎表明问题出在当前用户个人资料中对Genderdata 的引用 - 用户模型的扩展。此处显示:

class Profile(models.Model):
    UserID = models.OneToOneField(User, on_delete=models.CASCADE)
    GENDERS = (("M","Male"), ("F","Female"))
    Gender = models.CharField(max_length=1, choices=GENDERS)
    UserTypeID = models.ForeignKey(UserType, on_delete=models.PROTECT, blank=True, null=True)
    EmailConfirmed = models.BooleanField(default=False)

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(UserID=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

如果不是上述方式,我如何正确引用登录用户配置文件的Gender 属性?

【问题讨论】:

  • 什么是选举以及它与个人资料有何关系?
  • @DanielRoseman Election 是一个模型,它也有一个名为 Gender 的字段。我想确保返回的选举模型与用户的个人资料具有相同的性别值。我已经编辑了问题以更好地解释这一点。

标签: python django django-models django-users


【解决方案1】:

一对一字段的反向访问器始终是模型的小写名称:所以它应该是request.user.profile...

如果您遵循标准 PEP-8 兼容样式并将所有字段命名为小写 - gendervoting_openemail_confirmed 等,这对您来说就不那么令人惊讶了。另外请注意,给出以ID 结尾的关系字段名称,因为它们可以访问整个相关对象,而不仅仅是ID,因此您的UserID 应仅称为user

最后,关于性别,请阅读Falsehoods Programmers believe about Gender 并考虑是否真的需要询问这些信息。

【讨论】:

  • 非常感谢您的建议。该解决方案已经奏效,我肯定会使用您将来所说的更清晰的约定。
猜你喜欢
  • 1970-01-01
  • 2015-09-21
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
相关资源
最近更新 更多