Django: Менеджер не доступен через экземпляры MyModel - PullRequest
0 голосов
/ 04 марта 2019

Я создаю чат в django, и у меня проблема с получением объектов из модели Chat в django.Для объектов я получаю трассировку с сообщением: Manager isn't accessible via Chat instances, когда я пытаюсь получить к нему доступ.

Трассировка:

Exception inside application: Manager isn't accessible via Chat instances
  File "/Users/fokusiv/Projects/django-multichat-api/venv/lib/python3.6/site-packages/channels/sessions.py", line 179, in __call__
    return await self.inner(receive, self.send)
  File "/Users/fokusiv/Projects/django-multichat-api/venv/lib/python3.6/site-packages/channels/middleware.py", line 41, in coroutine_call
    await inner_instance(receive, send)
  File "/Users/fokusiv/Projects/django-multichat-api/venv/lib/python3.6/site-packages/channels/consumer.py", line 59, in __call__
    [receive, self.channel_receive], self.dispatch
  File "/Users/fokusiv/Projects/django-multichat-api/venv/lib/python3.6/site-packages/channels/utils.py", line 52, in await_many_dispatch
    await dispatch(result)
  File "/Users/fokusiv/Projects/django-multichat-api/venv/lib/python3.6/site-packages/asgiref/sync.py", line 108, in __call__
    return await asyncio.wait_for(future, timeout=None)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/tasks.py", line 339, in wait_for
    return (yield from fut)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/concurrent/futures/thread.py", line 56, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/Users/fokusiv/Projects/django-multichat-api/venv/lib/python3.6/site-packages/channels/db.py", line 13, in thread_handler
    return super().thread_handler(loop, *args, **kwargs)
  File "/Users/fokusiv/Projects/django-multichat-api/venv/lib/python3.6/site-packages/asgiref/sync.py", line 123, in thread_handler
    return self.func(*args, **kwargs)
  File "/Users/fokusiv/Projects/django-multichat-api/venv/lib/python3.6/site-packages/channels/consumer.py", line 105, in dispatch
    handler(message)
  File "/Users/fokusiv/Projects/django-multichat-api/venv/lib/python3.6/site-packages/channels/generic/websocket.py", line 39, in websocket_connect
    self.connect()
  File "/Users/fokusiv/Projects/django-multichat-api/chat/consumers.py", line 60, in connect
    is_participant_in_chat(self.room_name, self.scope['user'])
  File "/Users/fokusiv/Projects/django-multichat-api/chat/models.py", line 24, in is_participant_in_chat
    test = chat.objects
  File "/Users/fokusiv/Projects/django-multichat-api/venv/lib/python3.6/site-packages/django/db/models/manager.py", line 176, in __get__
    raise AttributeError("Manager isn't accessible via %s instances" % cls.__name__)
  Manager isn't accessible via Chat instances

Вот соответствующий код:

chat/model.py

from django.shortcuts import get_object_or_404
from django.db import models
import uuid as makeuuid
from users.models import Usern

def is_participant_in_chat(chatid, userid):
    chat = get_object_or_404(Chat, uuid=chatid)
    test = chat.objects
    #Check if userid is in participants
    return False

class Chat(models.Model):
uuid = models.UUIDField(primary_key=True, default=makeuuid.uuid4, editable=False)
name = models.CharField(max_length=50, blank=True)
participants = models.ManyToManyField(Usern, related_name='chats')

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

users / model.py

from django.db import models
import uuid as makeuuid
import os
from django.contrib.auth.models import AbstractUser


class Usern(AbstractUser):
    uuid = models.UUIDField(primary_key=True, default=makeuuid.uuid4, editable=False)
    name = models.CharField(max_length=50)

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

Полный проект можно найти здесь: https://github.com/martinlundin/django-multichat-api

Оцените любые указания, как решитьЭто!Спасибо

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Так же, как в сообщении об ошибке, вы не можете получить доступ к objects (Manager) из экземпляра Chat, вместо этого вам нужно использовать фактическую модель для доступа к objects, поэтому измените эту строку https://github.com/martinlundin/django-multichat-api/blob/master/chat/models.py#L24 на test = Chat.objects.all() или удалите эту строку, поскольку я не вижу ее в настоящее время в базе кода.

0 голосов
/ 04 марта 2019

Получив экземпляр Chat, вы можете проверить, является ли запрошенный пользователь участником:

def is_participant_in_chat(chatid, userid):
    chat = get_object_or_404(Chat, uuid=chatid)
    return chat.participants.filter(uuid=userid).exists()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...