Django - Как фильтровать при получении списка значений (values_list)?
У меня есть приложение, в котором есть несколько объектов, связанных с одной Моделью. Когда я пытаюсь получить данные для отображения в форме (для обновления), она либо выдает ошибку, либо не отображает никаких данных.
Для иллюстрации схемы мы имеем OBJECT(ID):
Project(1):
Issue(1)
Issue(42)
Issue(66)
Issue(97)
Что происходит выше, у меня есть несколько проблем, связанных с проектом. Я получаю идентификаторы проблем в проекте с помощью следующего набора запросов.
get_issue_id = get_object_or_404(DevProjects, pk=pk)
issue_id = DevIssues.objects.filter(project=get_issue_id).values_list('id', flat=True)
Который возвращает:
<QuerySet [1, 42, 66, 97]>
Я пытаюсь использовать следующий набор запросов для фильтрации ID проблемы из списка значений (values_list), чтобы установить Instance= (для форм) в наборе запросов для получения данных и отображения этих данных в форме только для ID проблем из Project PK, которые я запрашиваю.
update_issue = DevIssues.objects.filter(id=issue_id)
Ниже приведен мой текущий view.py
get_issue_id = get_object_or_404(DevProjects, pk=pk)
issue_id = DevIssues.objects.filter(project=get_issue_id).values_list('id', flat=True)
update_issue = DevIssues.objects.filter(id=issue_id)
update_issue_form = UpdateProjectIssues(instance=update_issue)
if request.method == 'POST' and 'updateissue' in request.POST:
update_issue_form = UpdateProjectIssues(request.POST, instance=update_issue)
if update_issue_form.is_valid():
update_issue_form.save()
Вот models.py для DevProjects и DevIssues:
class DevProjects(models.Model):
PROJECT_TYPE = [
('NEW_APP', 'New Application'),
('UPDATE_APP', 'Update Application'),
('BUG_FIX', 'Bug Fixes')
]
PROJECT_STATUS = [
('New', 'New'),
('In Progress', 'In Progress'),
('Complete', 'Complete'),
]
project_id = models.CharField(max_length=15, editable=False)
project_title = models.CharField(max_length=100)
project_desc = models.CharField(max_length=500)
project_category = models.CharField(max_length=25, choices=PROJECT_TYPE, null=True, blank=True)
project_status = models.CharField(max_length=25, choices=PROJECT_STATUS, default='New')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateField(auto_now=True)
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
def save(self, *args, **kwargs):
super(DevProjects, self).save(**kwargs)
self.project_id = 'PROJ-' + str(self.id)
super(DevProjects, self).save(**kwargs)
def __str__(self):
return self.project_title
def get_absolute_url(self):
return reverse('update_project', args=[self.id])
class DevProjectNotes(models.Model):
project = models.ForeignKey(DevProjects, on_delete=models.CASCADE, related_name='notes')
notes = models.CharField(max_length=500)
created_at = models.DateTimeField(auto_now_add=True)
added_by = models.ForeignKey(User, on_delete=models.CASCADE)
class DevIssues(models.Model):
ISSUE_CODE = [
('BUG', 'Bug'),
('BACKLOG', 'Backlog'),
('REQUEST', 'Request'),
('TODO', 'To-Do'),
]
ISSUE_STATUS = [
('New', 'New'),
('In Progress', 'In Progress'),
('Complete', 'Complete'),
]
issue_id = models.CharField(max_length=15, editable=False)
project = models.ForeignKey(DevProjects, on_delete=models.CASCADE, related_name='issue')
issue = models.CharField(max_length=100)
issue_desc = models.CharField(max_length=500)
issue_code = models.CharField(max_length=9, choices=ISSUE_CODE, null=True, blank=True)
issue_status = models.CharField(max_length=15, choices=ISSUE_STATUS, default='New')
issue_resolution = models.CharField(max_length=500, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateField(auto_now=True)
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
def save(self, *args, **kwargs):
self.issue_id = 'ISSUE-' + str(self.id)
super(DevIssues, self).save(**kwargs)
Вот мой файл forms.py:
class UpdateProjectIssues(forms.ModelForm):
class Meta:
model = DevIssues
fields= ["issue", "issue_desc", "issue_code", "issue_status"]
labels = {
'issue_status': 'Update Status'
}
И вот с какой ошибкой я сталкиваюсь в настоящее время:
'QuerySet' object has no attribute '_meta'
Когда я использую get(), вот какую ошибку я получаю:
The QuerySet value for an exact lookup must be limited to one result using slicing.
Другая ошибка, которую я получаю, когда использую что-то вроде id__in
:
get() returned more than one DevIssues -- it returned 2!
Как мне отфильтровать 'issue_id'
, кверисет values_list, чтобы получить данные и отобразить правильные данные в форме?
Получить экземпляр проекта
project_id = get_object_or_404(DevProjects, pk=pk)
Для получения идентификаторов проблем, связанных с данным экземпляром проекта
issue_ids = DevIssues.objects.filter(project=project_id).values_list('id', flat=True)
Получение объектов проблемы обновления
update_issue = DevIssues.objects.filter(id__in=issue_ids)
но вы уже получили тот же результат в этой строке
update_issue = DevIssues.objects.filter(project=project_id)
Итак, не нужно IN qyery.
Вы получили ошибку, потому что передали queryset вместо object в этой строке
update_issue_form = UpdateProjectIssues(instance=update_issue)