【问题标题】:ValueError: Cannot query "": Must be "User" instanceValueError:无法查询“”:必须是“用户”实例
【发布时间】:2023-03-27 18:27:01
【问题描述】:

我正在尝试创建一个追随者系统,用户可以在其中关注投资者,而不是在用户和用户之间,而是在用户和投资者之间。但是我遇到了一个错误。

我仍然不确定我是否必须创建一个不同的表来关注,但这里是代码。请分享您的想法,以便在用户和投资者之间更好地建模跟随系统

来自 models.py

class Investor(models.Model):
    investor = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=200, blank=False,
                            null=False, help_text='Full Name')
    followers = models.ManyToManyField(
        User, related_name='followers', blank=True)

    @classmethod
    def follow_investor(cls, investor, follower):
        investor, created = cls.objects.get_or_create(investor=investor)
        investor.followers.add(follower)

    @classmethod
    def unfollow_investor(cls, investor, follower):
        investor, created = cls.objects.get_or_create(investor=investor)
        investor.followers.remove(follower)



url(r'^investor/(?P<action>.+)/(?P<slug>[-\w]+)$',
    views.follow_unfollow_investor, name="follow-unfollow-investor"),


def follow_unfollow_investor(request, action, slug=None):
    follower = request.user
    investor = Investor.objects.get(slug=slug)
    if action == "add":
        Investor.follow_investor(investor, follower)
    elif action == "remove":
        Investor.unfollow_investor(user, follower)
    return redirect('/')

更新 用户来自 django.contrib.auth.models

堆栈跟踪

Internal Server Error: /investor/add/milan-raymond
Traceback (most recent call last):
  File "/home/milan/.virtualenvs/startup/lib/python3.5/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/home/milan/.virtualenvs/startup/lib/python3.5/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/milan/.virtualenvs/startup/lib/python3.5/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/milan/Projects/startup/investors/views.py", line 32, in follow_unfollow_investor
    Investor.follow_investor(investor, follower)
  File "/home/milan/Projects/startup/investors/models.py", line 72, in follow_investor
    investor, created = cls.objects.get_or_create(investor=investor)
  File "/home/milan/.virtualenvs/startup/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/milan/.virtualenvs/startup/lib/python3.5/site-packages/django/db/models/query.py", line 464, in get_or_create
    return self.get(**lookup), False
  File "/home/milan/.virtualenvs/startup/lib/python3.5/site-packages/django/db/models/query.py", line 371, in get
    clone = self.filter(*args, **kwargs)
  File "/home/milan/.virtualenvs/startup/lib/python3.5/site-packages/django/db/models/query.py", line 784, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/home/milan/.virtualenvs/startup/lib/python3.5/site-packages/django/db/models/query.py", line 802, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/home/milan/.virtualenvs/startup/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1250, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/home/milan/.virtualenvs/startup/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1276, in _add_q
    allow_joins=allow_joins, split_subq=split_subq,
  File "/home/milan/.virtualenvs/startup/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1179, in build_filter
    self.check_related_objects(field, value, opts)
  File "/home/milan/.virtualenvs/startup/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1076, in check_related_objects
    self.check_query_object_type(value, opts, field)
  File "/home/milan/.virtualenvs/startup/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1054, in check_query_object_type
    (value, opts.object_name))
ValueError: Cannot query "milan": Must be "User" instance.
[09/Oct/2017 14:02:18] "GET /investor/add/milan-raymond HTTP/1.1" 500 138655

【问题讨论】:

  • 添加User模型的定义和错误的堆栈跟踪。
  • @ShikharChauhan 我已经用堆栈跟踪更新了这个问题。关于用户模型,它继承自 django.contrib.auth.models

标签: python django django-models django-views


【解决方案1】:

要回答您的问题,请更改:

investor, created = cls.objects.get_or_create(investor=investor)

进入

investor, created = cls.objects.get_or_create(investor=investor.investor)

您应该将 investor 字段重命名为 user 以避免混淆;)

【讨论】:

  • 非常感谢这解决了我的问题。由于命名问题,我感到困惑。我觉得给正确的名字有问题:)。你对建模部分有什么想法吗?我认为单独的表格更适合关注,因为我可能需要关注时间、取消关注时间等。你说什么?
猜你喜欢
  • 2021-04-08
  • 2020-07-17
  • 1970-01-01
  • 2021-02-15
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
相关资源
最近更新 更多