PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como você junta duas tabelas em um campo de chave estrangeira usando o django ORM?


Eu tenho trabalhado com django por um tempo agora e tive um tempo muito difícil para descobrir as junções de tabelas, mas acho que finalmente entendi e gostaria de passar isso para outras pessoas para que possam evitar a frustração que eu tive com isso.

Considere o seguinte model.py:
class EventsMeetinglocation(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=100)
    address = models.CharField(max_length=200)

    class Meta:
        managed = True
        db_table = 'events_meetinglocation'

class EventsBoardmeeting(models.Model):
    id = models.IntegerField(primary_key=True)
    date = models.DateTimeField()
    agenda_id = models.IntegerField(blank=True, null=True)
    location_id = models.ForeignKey(EventsMeetinglocation)
    minutes_id = models.IntegerField(blank=True, null=True)

    class Meta:
       managed = True
       db_table = 'events_boardmeeting'

Aqui podemos ver que location_id em EventsBoardmeeting é uma chave estrangeira para o id em EventsMeetinglocation . Isso significa que devemos ser capazes de consultar as informações em EventsMeetinglocation passando por EventsBoardmeeting .

Agora considere as seguintes views.py:
def meetings(request):
    meetingData = EventsBoardmeeting.objects.all()
    return render(request, 'board/meetings.html', {'data': meetingData })

Como dito muitas vezes antes em outros posts, o django cuida das junções automaticamente. Quando consultamos tudo em EventsBoardmeeting também obtemos qualquer informação relacionada por chave estrangeira, mas a maneira como acessamos isso em html é um pouco diferente. Temos que passar pela variável usada como chave estrangeira para acessar as informações associadas a essa junção. Por exemplo:
{% for x in data %}
   {{ x.location_id.name }}
{% endfor %}

O acima referencia TODOS os nomes na tabela que foram o resultado da junção na chave estrangeira. x é essencialmente o EventsBoardmeeting table, então quando acessamos x.location_id estamos acessando a chave estrangeira que nos dá acesso às informações em EventsMeetinglocation .