代码之家  ›  专栏  ›  技术社区  ›  user3114168

Django-在视图中连接两个表并在模板中使用

  •  0
  • user3114168  · 技术社区  · 7 年前

    我在Diango 2.0.2中使用python 3.4.5

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

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

    程序名称,程序。program\u id,程序。筛选器(用户=request.user.id)。状态(如果存在,如果不存在,则保持为空)

    型号。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)
    

    视图。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\u id,程序。筛选器(用户=request.user.id)。地位

    我有两种解决方案,

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

    (2) 将程序表发送到模板,并使用类似程序的内容。筛选器(用户=request.user.id)。“td”中的状态

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

    桌子应该是这样的

    NameA, 123, yes
    NameB, 234, 
    NameC, 345, no
    NameD, 456, 
    NameE, 567, no
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Antwane    7 年前

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

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

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

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

    您可以找到有关 Many to One relationships Related objects Django文件中。仅供参考,例如。programinfo\u集是 RelatedManager (更通用的子类 Manager )。因此,它为查找此关系中包含的实例提供了一个接口。

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

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