django 如何AssertFK不为空使用它的id与mypy

qojgxg4l  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(116)

我有几个模型:

class MyUser(models.Model):
  district = models.ForeignKey(
        District,
        on_delete=models.CASCADE,
        default=None,
        blank=True,
        null=True,
  )

class District(models.Model):
   timezone = TimeZoneField(default="US/Eastern")

我正在尝试写一个函数来获取用户的时区。
我试过这个:

def get_timezone_for_user(user: MyUser) -> datetime.timezone:
    if not user.district_id:
        return DEFAULT_TIMEZONE

    return user.district.timezone

但是mypy不喜欢这样,因为它认为user.district仍然可以是None,即使我知道它不能,因为district_id的存在意味着user.district也不是None。
我可以在其中添加一个assert user.district is not None,但这样我将引发一个额外的查询,只是为了说服mypy。有什么不需要添加额外查询的想法吗?

u3r8eeie

u3r8eeie1#

您已经在return语句中执行了额外的SQL查询,因此这种方法应该执行相同数量的SQL语句。如果user.district_idNone,则ORM无论如何都不会尝试SELECT

def get_timezone_for_user(user: MyUser) -> datetime.timezone:
    district = user.district
    if not district:
        return district.timezone

    return district.timezone

相关问题