【问题标题】:Cannot query "amclient15": Must be "Client" instance无法查询“amclient15”:必须是“客户端”实例
【发布时间】:2022-07-26 16:19:35
【问题描述】:

我正在尝试过滤特定客户在登录时所做的约会

def user( request):
    
    client = request.user.client
    request.user.id
    
    appointments = Appointment.objects.filter(user=request.user)

    context = { 'client': client, 'appointments':appointments
               }

    return render(request, 'users/user.html', context)

这是我的模型。我可以显示所有约会,但是当我尝试过滤特定约会以供用户在自己的页面上查看时,问题就出现了

# Create your models here.


from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _



class Client(models.Model):
    user = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=200, null=True)
    phone = models.CharField(max_length=200, null=True)
    email = models.CharField(max_length=200, null=True)
    profile_pic = models.ImageField(default="profile1.png", null=True, blank=True)
    date_created = models.DateTimeField(auto_now_add=True, null=True)

    def __str__(self):
        return self.name



class Worker(models.Model):
    CATEGORY = (
        ('Plumbing', 'Plumbing'),
        ('Electrical', 'Electrical'),
        ('Cleaning', 'Cleaning'),
    )
 
    user = models.OneToOneField(
        User, null=True, blank=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=200, null=True)
    phone = models.CharField(max_length=200, null=True)
    email = models.CharField(max_length=200, null=True)
    profile_pic = models.ImageField(
        default="profile2.png", null=True, blank=True)
    area_of_operation = models.CharField(max_length=200, null=True)
    category = models.CharField(max_length=200, null=True, choices=CATEGORY)
    description = models.CharField(max_length=200, null=True, blank=True)
    date_created = models.DateTimeField(auto_now_add=True, null=True)
    date_updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name


class Appointment(models.Model):
    CATEGORY = (
        ('Plumbing', 'Plumbing'),
        ('Electrical', 'Electrical'),
        ('Cleaning', 'Cleaning'),
    )
    STATUS = (
        ('Pending', 'Pending'),
        ('Delivered', 'Delivered'),
    )

    user = models.ForeignKey(Client, null=True, on_delete=models.SET_NULL)
    name = models.CharField(max_length=200, null=True)
    worker = models.ForeignKey(Worker, null=True, on_delete=models.SET_NULL)
    category = models.CharField(max_length=200, null=True, choices=CATEGORY)
    task_date = models.DateField(_("Task Date"), blank=True, null=True)
    task_location = models.CharField(max_length=200, null=True)
    date_created = models.DateTimeField(auto_now_add=True, null=True)
    status = models.CharField(max_length=200, null=True, choices=STATUS)
    budget = models.FloatField(null=True)
    task_description = models.CharField(max_length=1000, null=True, )
    task_image = models.ImageField(
        null=True, blank=True, help_text='Optional.')

    def __str__(self):
        return str(self.user)



RATING=(
    (1,'1'),
    (2,'2'),
    (3,'3'),
    (4,'4'),
    (5,'5'),
)



class YoReview(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    worker = models.ForeignKey(Worker, on_delete=models.CASCADE)
    review_text = models.TextField()
    review_rating = models.CharField(choices=RATING, max_length=150)

    def get_review_rating(self):
        return self.review_rating

这是我在运行项目时收到的错误消息

December 08, 2021 - 13:02:36
Django version 3.2.9, using settings 'it.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
Internal Server Error: /user/
Traceback (most recent call last):
  File "C:\Users\PROBOOK 440\Envs\myenv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\PROBOOK 440\Envs\myenv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\PROBOOK 440\Envs\myenv\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "C:\Users\PROBOOK 440\projects\it\david\decorators.py", line 24, in wrapper_func
    return view_func(request, *args, **kwargs)
  File "C:\Users\PROBOOK 440\projects\it\david\views.py", line 216, in user
    appointments = Appointment.objects.filter(user=request.user)
  File "C:\Users\PROBOOK 440\Envs\myenv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\PROBOOK 440\Envs\myenv\lib\site-packages\django\db\models\query.py", line 941, in filter
    return self._filter_or_exclude(False, args, kwargs)
  File "C:\Users\PROBOOK 440\Envs\myenv\lib\site-packages\django\db\models\query.py", line 961, in _filter_or_exclude
    clone._filter_or_exclude_inplace(negate, args, kwargs)
  File "C:\Users\PROBOOK 440\Envs\myenv\lib\site-packages\django\db\models\query.py", line 968, in _filter_or_exclude_inplace
    self._query.add_q(Q(*args, **kwargs))
  File "C:\Users\PROBOOK 440\Envs\myenv\lib\site-packages\django\db\models\sql\query.py", line 1393, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "C:\Users\PROBOOK 440\Envs\myenv\lib\site-packages\django\db\models\sql\query.py", line 1412, in _add_q
    child_clause, needed_inner = self.build_filter(
  File "C:\Users\PROBOOK 440\Envs\myenv\lib\site-packages\django\db\models\sql\query.py", line 1320, in build_filter
    self.check_related_objects(join_info.final_field, value, join_info.opts)
  File "C:\Users\PROBOOK 440\Envs\myenv\lib\site-packages\django\db\models\sql\query.py", line 1147, in check_related_objects
    self.check_query_object_type(value, opts, field)
  File "C:\Users\PROBOOK 440\Envs\myenv\lib\site-packages\django\db\models\sql\query.py", line 1128, in check_query_object_type
    raise ValueError(
ValueError: Cannot query "amclient15": Must be "Client" instance.

【问题讨论】:

  • 这看起来不像是与 Django 相关的问题,而更像是与特定客户端相关的问题。主题中的错误与你的代码不匹配(amclient15 在代码 sn-p 中没有提到)。你没有解释这个客户是什么。需要更多细节:首先将相关的导入语句添加到您的代码 sn-p 和错误堆栈跟踪/输出中。
  • amclient15 是当前登录客户端的用户名
  • 请分享完整的错误回溯和您的模型
  • 你可以查看,我已经分享了

标签: django


【解决方案1】:

Appointment.user 字段不是User 的实例,它是Client 的实例,但request.user 仍然是User

您想关注Client 的关系并过滤Client.user 字段。

appointments = Appointment.objects.filter(user__user=request.user)

为您的字段命名总是一个好主意,即 Appointment 中的 ForeignKey 可能应该命名为 client,而不是提醒您它实际上不是用户而是客户端。

【讨论】:

    【解决方案2】:

    krs 兄弟,您的回答帮助我解决了类似的问题。谢谢

    【讨论】:

      猜你喜欢
      • 2020-07-17
      • 2023-03-27
      • 2021-04-08
      • 2021-11-20
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 2017-12-27
      相关资源
      最近更新 更多