【问题标题】:How do I map one models objects to another models objects in a view如何将一个模型对象映射到视图中的另一个模型对象
【发布时间】:2026-01-03 17:30:01
【问题描述】:

我有一堆消息记录,我想分配给不同的任务箱。

#models.py

class TaskBox(models.Model):
    name = models.CharField(max_length=64, blank=False)

    def __str__(self):
        return u'%s' % (self.name)

    class Admin:
        pass

class InboxEntry(models.Model):
    job_number = models.CharField(max_length=14, unique=False, blank=False, null=False)
    job_name = models.CharField(max_length=64, unique=False, blank=False, null=False)
    request = models.CharField(max_length=64, choices=PRINT_CHOICES, blank=True, null=True)
    date_due = models.DateTimeField(("Due"),auto_now=False)
    note = models.TextField(max_length=1000, unique=False, blank=True, null=True)
    assigned_by = models.ForeignKey(UserProfile, blank=False, null=False)
    box = models.ForeignKey(TaskBox)
    assigned_to = models.ManyToManyField(UserProfile, related_name='name', blank=True)
    status = models.CharField(max_length=30, choices=STATUS_CHOICES, default="Awaiting Action")

    def __str__(self):
        return u'%s %s' % (self.job_number, self.job_name)

    class Admin: 
        pass

    class Meta:
        ordering = ['status']

这个想法是让模板有一些通用标签,如 {{ for taskbox in taskboxes }} 为每个任务框创建一个单独的 div,该 div 将保存一个用于该框记录的表。我的问题是构造视图函数...

#views.py

def display_prdInboxEntry(request, id):
    if request.method == 'POST':
        form = PrdInboxForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('taskmanager/display/'+ id +'/')
        else:
            form = PrdInboxForm(request.POST)
            return HttpResponseRedirect('taskmanager/display/'+ id +'/')

    else:
        form = PrdInboxForm()
        user = request.user
        **taskboxes = TaskBox.objects.all()
        records_1 = InboxEntry.objects.filter(taskboxes[id]=1)
        records_2 = InboxEntry.objects.filter(taskboxes[id]=2)
        records_3 = InboxEntry.objects.filter(taskboxes[id]=3)
        ..... **

        return render_to_response('taskmanager/taskmanager_view.html', {'form': form, 'taskboxes': taskboxes, 'records_1' : records_1, 'records_2' : records_2, 'records_3' : records_3, 'user': user}, context_instance=RequestContext(request))

InboxEntry 模型有一个名为“box”的字段,它只是对 TaskBox 模型的引用。我需要一种方法来映射说... TaskBox id 1 与所有带有“box = 1”的 InboxEntry 对象,以便我可以适当地填充模板。我可以构造函数来适应这个,还是我完全错误的方式?

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    听起来您正在寻找自动生成的反向查找属性。您可以获得与 TaskBox 关联的所有 InboxEntries 中的 QuerySet,如下所示:

    TaskBox.objects.filter(id=1).inboxentry_set.all()
    

    请参阅documentation on related objects

    【讨论】:

    • 返回一个在模板中不可迭代的任务框对象,而不是与特定任务框相关的条目查询集。
    • @kjarsenal:我的错误,inboxentry_setManager,而不是 QuerySet。所以你可以过滤它等等。如果你想要它们,只需使用all()
    最近更新 更多