Объект «ManyRelatedManager» не имеет атрибута «пользователь» - PullRequest
0 голосов
/ 05 января 2020

Я пытаюсь создать систему уведомлений, но у меня возникают проблемы с этим.

вот мой код:

Я создал модель уведомлений, где каждая запись является уведомлением. Каждый раз, когда в мою модель SalesTask делается новая запись, она вызывает мой обработчик сигнала, который создает новую запись в моей модели уведомлений. Затем я передам эту модель в свой контекст и отобразлю ее в моем HTML.

    class Notifications(models.Model):
    notifications_id = models.AutoField(primary_key=True)
    user = models.ForeignKey(User)
    time = models.DateTimeField(auto_now=True)
    message = models.TextField(max_length=100 ,default ='test')
    object_url = models.CharField(max_length=500, default ='test')
    is_read = models.BooleanField(default=False)


def CreateTaskNotification(sender,**kwargs):
    if kwargs['created']:
        notification = Notifications.objects.create(user = kwargs['instance'].salesExtra.username,
                                                    message = 'You have been assigned a new task',
                                                    object_url = kwargs['instance'].get_absolute_url(self)
                                                    )

post_save.connect(CreateTaskNotification,sender=SalesTask)

Проблема заключается в том, что мои модели SalesTask:

class SalesTask(models.Model):
sales_status= (
    ('p1','Phase 1'),
    ('p2','Phase 2'),
    ('p3','Phase 3'),
    ('p4','Phase 4'),
)
sales_priority= (
    ('Urgent','Urgent'),
    ('Medium','Medium'),
    ('Low','Low'),
)
task_id = models.AutoField(primary_key=True)
salesExtra= models.ManyToManyField('SalesExtra')
sales_project= models.ForeignKey('SalesProject',on_delete=models.CASCADE)
title = models.TextField(max_length=50 , default='Your Title' )
description = models.TextField(max_length=200 , default='Your Description' )
priority = models.TextField(max_length=10 , choices= sales_priority ,default='Low' )
date_time = models.DateTimeField(auto_now=True)
status = models.TextField(max_length=10, choices= sales_status ,default='p1')
due_date = models.DateTimeField(default=timezone.now)

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

def get_absolute_url(self):
    return reverse('sales-task')

имеют поле «многие ко многим» с расширенной моделью модели «Пользователь» (SalesExtra). Это наиболее вероятно, почему я получаю сообщение об ошибке:

'ManyRelatedManager' object has no attribute 'user'

Это мои взгляды на создание нового экземпляра задачи:

class SalesTaskDetailView(CreateView):
model = SalesTaskingComments
template_name = 'rnd/task_details.html'
fields = ['comment']
exclude = ['comment_id']

def get_context_data(self, **kwargs):
    pk = self.kwargs['pk']
    context = super(SalesTaskDetailView, self).get_context_data(**kwargs)
    context['sales_task'] = SalesTask.objects.filter(task_id = pk)
    context['comments'] = SalesTaskingComments.objects.filter(salesTask__task_id__contains= pk)
    return context

def form_valid(self, form):
    task = get_object_or_404(SalesTask, task_id=self.kwargs['pk'])
    user = get_object_or_404(SalesExtra, user=self.request.user)
    form.instance.salesTask = task
    form.instance.salesExtras = user
    return super(SalesTaskDetailView, self).form_valid(form)

Поэтому мой вопрос: 1. Есть ли способ создать новую запись для каждого объекта SalesExtra? 2. Это лучший метод для создания системы уведомлений? (Я использую django 3.0, поэтому многие приложения, такие как django -notifications или django -activities-stream, не совместимы.)

1 Ответ

0 голосов
/ 05 января 2020

Если вы создаете сквозную таблицу для отношения «многие ко многим» между SalesTask и SalesExtra, вы можете добавить обработчик сигнала в эту сквозную таблицу, чтобы всякий раз, когда между 2 (предположительно, пользователь был добавлен) будет сделано уведомление. Если вы сохраните форму модели SalesTask, которая имеет мульти-выбор для дополнений, это будет срабатывать для каждого выбора

class SalesTask(models.Model):
    salesExtra = models.ManyToManyField('SalesExtra', through='SalesTaskExtra')


class SalesExtra(models.Model):
    pass


class SalesTaskExtra(models.Model):
    task = models.ForeignKey(SalesTask, on_delete=models.CASCADE)
    extra = models.ForeignKey(SalesExtra, on_delete=models.CASCADE)


def CreateTaskNotification(sender, **kwargs):
    if kwargs['created']:
        Notifications.objects.create(
            user=kwargs['instance'].extra.username,
            message='You have been assigned a new task',
            object_url=kwargs['instance'].task.get_absolute_url()
        )

post_save.connect(CreateTaskNotification, sender=SalesTaskExtra)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...