Tôi đã làm việc với django một thời gian và tôi đã có một thời gian khá khó khăn để tìm ra các phép tham gia bảng, nhưng tôi nghĩ rằng cuối cùng tôi đã hiểu và tôi muốn chuyển điều này cho những người khác để họ có thể tránh được sự thất vọng mà tôi đã có với nó.
Hãy xem xét mô hình sau.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'
Ở đây, chúng ta có thể thấy rằng location_id
trong EventsBoardmeeting
là khóa ngoại cho id trong EventsMeetinglocation
. Điều này có nghĩa là chúng ta có thể truy vấn thông tin trong EventsMeetinglocation
bằng cách xem qua EventsBoardmeeting
.
Bây giờ hãy xem xét các view.py:
def meetings(request):
meetingData = EventsBoardmeeting.objects.all()
return render(request, 'board/meetings.html', {'data': meetingData })
Như đã nói nhiều lần trước đây trong các bài viết khác, django sẽ tự động xử lý các liên kết. Khi chúng tôi truy vấn mọi thứ trong EventsBoardmeeting
chúng tôi cũng nhận được bất kỳ thông tin liên quan nào bằng khóa ngoại, Nhưng cách chúng tôi truy cập thông tin này trong html hơi khác một chút. Chúng ta phải đi qua biến được sử dụng làm khóa ngoại để truy cập thông tin được liên kết với phép nối đó. Ví dụ:
{% for x in data %}
{{ x.location_id.name }}
{% endfor %}
Ở trên tham chiếu TẤT CẢ các tên trong bảng là kết quả của phép nối trên khóa ngoại. x
về cơ bản là EventsBoardmeeting
bảng, vì vậy khi chúng tôi truy cập x.location_id
chúng tôi đang truy cập khóa ngoại cho phép chúng tôi truy cập thông tin trong EventsMeetinglocation
.