Django - 在视图中加入两个表并在模板中使用它

时间:2018-04-19 08:27:12

标签: python django django-templates django-views

我使用python 3.4.5和Diango 2.0.2

我有两张带外键的表。出于某些原因,我需要使用2个表来存储这些数据。

我想生成一个包含以下信息的表。

program.name,program.program_id,program.filter(user = request.user.id).status(如果存在,如果不存在,则保持为NULL)

models.py

class Program(models.Model):
    name = models.CharField(max_length=128, null=True, blank=True, default=None)
    program_id = models.AutoField(primary_key=True)

class ProgramInfo(models.Model):
    pid = models.ForeignKey(Program, on_delete=models.CASCADE, null=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    status = models.CharField(max_length=10, default=1003)

views.py

def program_list(request):
    program = Program.objects.all()
    return render(request, 'panel/program_list.html', {'program': program})

模板

{% for prog in program %}
<tr>
    <td> {{ prog.name }} </td>
    <td> {{ prog.program_id }} </td>
    <td> {{ "program's status of existing user" }} </td>
</tr>
{% endfor %}

如何生成包含以下信息的表?

program.name,program.program_id,program.filter(user = request.user.id).status

我有2个解决方案,

(1)生成一个表并将其传递给模板

(2)将程序表发送到模板,并使用类似program.filter(user = request.user.id).status in&#34; td&#34;

但我不知道如何为这两种解决方案做到这一点。

表格应该是这样的

NameA, 123, yes
NameB, 234, 
NameC, 345, no
NameD, 456, 
NameE, 567, no

1 个答案:

答案 0 :(得分:0)

ProgramInfo有一个指向Program实例的ForeignKey字段

pid = models.ForeignKey(Program, on_delete=models.CASCADE, null=True)

因此,您可以将多个ProgramInfo实例链接到单个Program实例。要检索该列表,只需使用:

program_instance = Program.objects.get(id=123)
# gives you the list of ProgramInfo instances:
programinfo_list = program_instance.programinfo_set

您可以在Django doc中找到有关Many to One relationshipsRelated objects的更多信息。仅供参考,instance.programinfo_set是RelatedManager(更通用的Manager的子类)。因此,它提供了查找此关系中包含的实例的接口。

如果您的模型之间只需要1对1的关系,请使用OneToOne字段:

pid = models.OneToOneField(Program, on_delete=models.CASCADE, null=True)