Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ForeignKeyField can't use isnull #270

Closed
lpig opened this issue Jan 10, 2020 · 4 comments
Closed

ForeignKeyField can't use isnull #270

lpig opened this issue Jan 10, 2020 · 4 comments
Labels
documentation Documentation needs to be updated

Comments

@lpig
Copy link

lpig commented Jan 10, 2020

isnull is not working in ForeignKeyField

models

class User(Model):
    SEX = {
        0: "未知",
        1: "男",
        2: "女",
    }
    nickname = fields.CharField(max_length=200, description='昵称', null=True)
    sex = fields.IntField(description='性别', default=0)
    openid = fields.CharField(max_length=100, description='openid')
    avatar = fields.CharField(max_length=2000, description='头像', null=True)
    create_time = fields.DatetimeField(auto_now_add=True)

    class Meta:
        table = 'member_user'

    def __str__(self):
        return '%s(%s)' % (self.nickname, self.openid)


class Employee(Model):
    name = fields.CharField(max_length=200, description='名称')
    user = fields.ForeignKeyField('models.User', related_name='employees', null=True)
    create_time = fields.DatetimeField(auto_now_add=True)

    class Meta:
        table = 'member_employee'

    def __str__(self):
        return '%s' % (self.name)

code

employees = await Employee.filter(user__isnull=True)

error

Traceback (most recent call last):
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/uvicorn/protocols/http/httptools_impl.py", line 385, in run_asgi
    result = await app(self.scope, self.receive, self.send)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/uvicorn/middleware/proxy_headers.py", line 45, in __call__
    return await self.app(scope, receive, send)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/uvicorn/middleware/debug.py", line 81, in __call__
    raise exc from None
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/uvicorn/middleware/debug.py", line 78, in __call__
    await self.app(scope, receive, inner_send)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/fastapi/applications.py", line 140, in __call__
    await super().__call__(scope, receive, send)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/starlette/applications.py", line 134, in __call__
    await self.error_middleware(scope, receive, send)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/starlette/middleware/errors.py", line 178, in __call__
    raise exc from None
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/starlette/middleware/errors.py", line 156, in __call__
    await self.app(scope, receive, _send)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/starlette/middleware/cors.py", line 76, in __call__
    await self.app(scope, receive, send)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/starlette/exceptions.py", line 73, in __call__
    raise exc from None
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/starlette/exceptions.py", line 62, in __call__
    await self.app(scope, receive, sender)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/starlette/routing.py", line 590, in __call__
    await route(scope, receive, send)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/starlette/routing.py", line 208, in __call__
    await self.app(scope, receive, send)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/starlette/routing.py", line 41, in app
    response = await func(request)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/fastapi/routing.py", line 127, in app
    raw_response = await dependant.call(**values)
  File "/Users/lp1ig/workplace/youyou-lottery/member/views.py", line 92, in employee_list
    employees = await Employee.filter(user__isnull=True)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/tortoise/queryset.py", line 524, in __await__
    self._make_query()
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/tortoise/queryset.py", line 511, in _make_query
    custom_filters=self._custom_filters,
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/tortoise/queryset.py", line 60, in resolve_filters
    modifier &= node.resolve(model, annotations, custom_filters)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/tortoise/query_utils.py", line 310, in resolve
    return self._resolve_kwargs(model)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/tortoise/query_utils.py", line 283, in _resolve_kwargs
    filter_modifier = self._resolve_regular_kwarg(model, key, value)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/tortoise/query_utils.py", line 241, in _resolve_regular_kwarg
    modifier = self._resolve_nested_filter(model, key, value)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/tortoise/query_utils.py", line 218, in _resolve_nested_filter
    custom_filters=self._custom_filters,
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/tortoise/query_utils.py", line 310, in resolve
    return self._resolve_kwargs(model)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/tortoise/query_utils.py", line 279, in _resolve_kwargs
    key, value = self._get_actual_filter_params(model, raw_key, raw_value)
  File "/Users/lp1ig/venv/youyou-lottery-AOMm0tqX/lib/python3.7/site-packages/tortoise/query_utils.py", line 273, in _get_actual_filter_params
    raise FieldError(f"Unknown filter param '{key}'. Allowed base values are {allowed}")
tortoise.exceptions.FieldError: Unknown filter param 'isnull'. Allowed base values are ['avatar', 'barrages', 'create_time', 'employees', 'id', 'nickname', 'openid', 'sex', 'winner']
@grigi
Copy link
Member

grigi commented Jan 10, 2020

Oh, I see what is going on here. There is ambiguity in the name.

  • <fk_field>__<fk_model_field>
  • <fk_field>__<filter>

Use the raw field instead:

employees = await Employee.filter(user_id__isnull=True)

I see the documentation is lacking info about the difference between the FK field and it's raw field on the DB.

@lpig
Copy link
Author

lpig commented Jan 10, 2020

Thanks you, it work again. :)

@grigi grigi closed this as completed Jan 10, 2020
@grigi grigi added the documentation Documentation needs to be updated label Jan 31, 2020
@grigi grigi reopened this Jan 31, 2020
@grigi grigi mentioned this issue Feb 4, 2020
20 tasks
@grigi
Copy link
Member

grigi commented Feb 10, 2020

Documented the FK _id caveats here: https://tortoise-orm.readthedocs.io/en/latest/models.html#the-db-backing-field

@grigi grigi closed this as completed Feb 10, 2020
@Tioit-Wang
Copy link

Documented the FK _id caveats here: https://tortoise-orm.readthedocs.io/en/latest/models.html#the-db-backing-field

this url is 404

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Documentation needs to be updated
Projects
None yet
Development

No branches or pull requests

3 participants