Используя related_name, чтобы вернуть набор запросов, не работающий в Django? - PullRequest
0 голосов
/ 26 сентября 2019

Здесь я работаю с двумя моделями. Обе модели имеют отношение ForeignKey к модели User.Здесь я хотел запросить staffs, is_reviewed_by и sent_by, и я попытался вот так.Когда я делаю фильтр, он возвращает набор запросов, но когда я использовал related_name для запроса, он выдает AttributeError.

Как я могу это сделать?

`Значение исключения: 'Оставить «объект не имеет атрибута» Review_by

models.py

class Leave(models.Model):
    staff = models.ForeignKey(get_user_model(),on_delete=models.CASCADE,related_name='staff_leave')
    organization = models.ForeignKey(Organization,on_delete=models.CASCADE,related_name='staff_leave')
    sub = models.CharField(max_length=300)
    msg = models.TextField()
    start_day = models.DateField()
    end_day = models.DateField()
    is_reviewed_by = models.ForeignKey(get_user_model(),on_delete=models.CASCADE,related_name='reviewed_by',blank=True,null=True)

class LeaveReply(models.Model):
    staff = models.ForeignKey(get_user_model(),on_delete=models.CASCADE,related_name='leave_status')
    leave = models.ForeignKey(Leave,on_delete=models.CASCADE,related_name='leave_status')
    sub = models.CharField(max_length=300,blank=True,null=True)
    msg = models.TextField(blank=True,null=True)
    sent_on = models.DateTimeField(auto_now_add=True)
    sent_by = models.ForeignKey(get_user_model(),on_delete=models.CASCADE,related_name='sent_by')

views.py

def leave_detail(request, pk):
    leave = get_object_or_404(Leave, pk=pk)
    reviewers = leave.reviewed_by.all() # not working
    staffs = leave.staff_leave.all() # does not works

    staffs = Leave.objects.filter(staff=leave.staff) # this works
    reviewers = Leave.objects.filter(is_reviewed_by=leave.is_reviewed_by)  # works

    reply_sender = LeaveReply.objects.filter(sent_by=leave.is_reviewed_by) #works 

    reply_sender = leave.sent_by.all() # doesn't works

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Вы немного смущены.Здесь нет ничего общего с related_name.

У вас есть объект Leave.Как говорится в ошибке, элементы Leave не имеют атрибутов reviewed_by, sent_by или staff_leave.Они имеют is_reviewed_by и staff;и единственный объект sent_by находится на объекте LeaveReply.

0 голосов
/ 26 сентября 2019

Отредактированный ответ

модели:

class Leave(models.Model):
    staff = models.ForeignKey(get_user_model(),on_delete=models.CASCADE,related_name='staff_leave')
    organization = models.ForeignKey(Organization,on_delete=models.CASCADE,related_name='staff_leave')  
    is_reviewed_by = models.ForeignKey(get_user_model(),on_delete=models.CASCADE,related_name='reviewed_by',blank=True,null=True) 

Я думаю, что эта модель предназначена для предоставления информации о сотруднике.

Не работаеткод:

reviewers = leave.reviewed_by.all() # not working
staffs = leave.staff_leave.all() # does not works

И это для персонала, который уходит в отпуск, и человека, который просмотрел заявление на отпуск.Оба поля связаны с моделью пользователя.Если у нас есть экземпляр Leave модели (то есть leave = get_object_or_404(Leave, pk=pk)), то мы можем получить эти два следующим образом:

staffs = leave.staff # for person who will be on leave
reviewers = leave.is_reviewed_by # for the person who reviewed the leave

Extra

Если мы имеем Пользователь экземпляр (user = get_object_or_404(User, pk=pk)), и мы хотим знать, сколько листьев он взял, тогда мы можем использовать связанное имя:

no_of_leaves_itaken = user.staff_leave.all()

или сколько листьев он просмотрел:

no_of_leaves_reviewed = user.staff_leave.all()
...