select_related 姜戈。为什么我不能在我的项目中使用 select_related?
select_related django. Why i can't using select_related in my project?
我是 django 的新手。我正在尝试使用 django ORM 而不是原始 sql。
这是我的模型:
class DosenPublikasi(models.Model):
userid = models.CharField(db_column='UserID', max_length=50, blank=True) # Field name made lowercase.
publikasiid = models.ForeignKey('self', db_column='PublikasiID', blank=True, null=True) # Field name made lowercase.
class Meta:
managed = False
db_table = 'dosen_publikasi'
class Publikasi(models.Model):
id = models.IntegerField(primary_key=True) # AutoField?
judul = models.CharField(db_column='Judul', max_length=255, blank=True) # Field name made lowercase.
nama_jurnal = models.CharField(db_column='Nama_Jurnal', max_length=255, blank=True) # Field name made lowercase.
tahun_pelaksanaan = models.CharField(db_column='Tahun_Pelaksanaan', max_length=255, blank=True) # Field name made lowercase.
issn = models.CharField(db_column='ISSN', max_length=255, blank=True) # Field name made lowercase.
volume = models.CharField(db_column='Volume', max_length=255, blank=True) # Field name made lowercase.
nomor = models.CharField(db_column='Nomor', max_length=255, blank=True) # Field name made lowercase.
halaman = models.CharField(db_column='Halaman', max_length=255, blank=True) # Field name made lowercase.
nama_dosen = models.CharField(db_column='Nama_Dosen', max_length=255, blank=True) # Field name made lowercase.
class Meta:
managed = False
db_table = 'publikasi'
并考虑我的模型。我尝试创建这样的视图:
def lihat_riwayat_publikasi(request):
username_session = request.session['username']
hak_akses_session = request.session['hak_akses']
publikasi = DosenPublikasi.objects.select_related().get(userid=username_session)
data = {
'object_list':publikasi,
'username':username_session,
'hak_akses':hak_akses_session,
}
return render(request, 'lihat_riwayat_publikasi.html', data)
然后我将我的数据视图发送到我的 html 模板:
{% for publikasi in object_list %}
<tr>
<td>{{ forloop.counter }}</td> <!-- forloop.counter digunakan untuk membuat angka iterasi secara otomatis(nomor) -->
<td>{{ publikasi.tahun_pelaksanaan }}</td>
<td>{{ publikasi.nama_dosen }} </td>
<td>{{ publikasi.judul }} . {{ publikasi.nama_jurnal }} . ISSN: {{ publikasi.issn }} . Vol. {{ publikasi.volume }} . No. {{ publikasi.nomor }} . Hal. {{ publikasi.halaman }}</td>
<td>
<a href="{% url "ubah_riwayat_publikasi" publikasi.id %}"><button class="btn btn-primary btn-xs"><i class="fa fa-pencil"></i> Edit </button></a>
<a href="{% url "delete_riwayat_publikasi" publikasi.id %}"><button class="btn btn-danger btn-xs"><i class="fa fa-trash-o "></i> </button></a>
</td>
</tr>
{% endfor %}
我的问题:
- 为什么结果中没有数据显示?我查询错了吗?
- 如果我错了。请告诉我可以显示数据的正确查询是什么?
因为我觉得我的观点是错误的
publikasi = DosenPublikasi.objects.select_related().get(userid=username_session)
非常感谢。您的意见会有所帮助
DosenPublikasi.objects.get()
return单曲DosenPublikasi
。调用 select_related()
将遵循来自 DosenPublikasi
的外键以减少 SQL 查询的数量,但它仍将 return 单个 DosenPublikasi
.
如果每个用户可以有多个 DosenPublikasi
,则使用 filter()
而不是 get()
publikasi = DosenPublikasi.objects.select_related().filter(userid=username_session)
然后,在您的模板中,当您循环 object_list
时,您将循环 DosenPublikasi
,而不是 Publikasi
。您需要按照外键访问 Publikasi
字段。例如:
{% for dosen_publikasi in object_list %}
<tr>
<td>{{ dosen_publikasi.publikasiid.nama_dosen }}</td>
</tr>
{% endfor %}
我是 django 的新手。我正在尝试使用 django ORM 而不是原始 sql。
这是我的模型:
class DosenPublikasi(models.Model):
userid = models.CharField(db_column='UserID', max_length=50, blank=True) # Field name made lowercase.
publikasiid = models.ForeignKey('self', db_column='PublikasiID', blank=True, null=True) # Field name made lowercase.
class Meta:
managed = False
db_table = 'dosen_publikasi'
class Publikasi(models.Model):
id = models.IntegerField(primary_key=True) # AutoField?
judul = models.CharField(db_column='Judul', max_length=255, blank=True) # Field name made lowercase.
nama_jurnal = models.CharField(db_column='Nama_Jurnal', max_length=255, blank=True) # Field name made lowercase.
tahun_pelaksanaan = models.CharField(db_column='Tahun_Pelaksanaan', max_length=255, blank=True) # Field name made lowercase.
issn = models.CharField(db_column='ISSN', max_length=255, blank=True) # Field name made lowercase.
volume = models.CharField(db_column='Volume', max_length=255, blank=True) # Field name made lowercase.
nomor = models.CharField(db_column='Nomor', max_length=255, blank=True) # Field name made lowercase.
halaman = models.CharField(db_column='Halaman', max_length=255, blank=True) # Field name made lowercase.
nama_dosen = models.CharField(db_column='Nama_Dosen', max_length=255, blank=True) # Field name made lowercase.
class Meta:
managed = False
db_table = 'publikasi'
并考虑我的模型。我尝试创建这样的视图:
def lihat_riwayat_publikasi(request):
username_session = request.session['username']
hak_akses_session = request.session['hak_akses']
publikasi = DosenPublikasi.objects.select_related().get(userid=username_session)
data = {
'object_list':publikasi,
'username':username_session,
'hak_akses':hak_akses_session,
}
return render(request, 'lihat_riwayat_publikasi.html', data)
然后我将我的数据视图发送到我的 html 模板:
{% for publikasi in object_list %}
<tr>
<td>{{ forloop.counter }}</td> <!-- forloop.counter digunakan untuk membuat angka iterasi secara otomatis(nomor) -->
<td>{{ publikasi.tahun_pelaksanaan }}</td>
<td>{{ publikasi.nama_dosen }} </td>
<td>{{ publikasi.judul }} . {{ publikasi.nama_jurnal }} . ISSN: {{ publikasi.issn }} . Vol. {{ publikasi.volume }} . No. {{ publikasi.nomor }} . Hal. {{ publikasi.halaman }}</td>
<td>
<a href="{% url "ubah_riwayat_publikasi" publikasi.id %}"><button class="btn btn-primary btn-xs"><i class="fa fa-pencil"></i> Edit </button></a>
<a href="{% url "delete_riwayat_publikasi" publikasi.id %}"><button class="btn btn-danger btn-xs"><i class="fa fa-trash-o "></i> </button></a>
</td>
</tr>
{% endfor %}
我的问题:
- 为什么结果中没有数据显示?我查询错了吗?
- 如果我错了。请告诉我可以显示数据的正确查询是什么?
因为我觉得我的观点是错误的
publikasi = DosenPublikasi.objects.select_related().get(userid=username_session)
非常感谢。您的意见会有所帮助
DosenPublikasi.objects.get()
return单曲DosenPublikasi
。调用 select_related()
将遵循来自 DosenPublikasi
的外键以减少 SQL 查询的数量,但它仍将 return 单个 DosenPublikasi
.
如果每个用户可以有多个 DosenPublikasi
,则使用 filter()
而不是 get()
publikasi = DosenPublikasi.objects.select_related().filter(userid=username_session)
然后,在您的模板中,当您循环 object_list
时,您将循环 DosenPublikasi
,而不是 Publikasi
。您需要按照外键访问 Publikasi
字段。例如:
{% for dosen_publikasi in object_list %}
<tr>
<td>{{ dosen_publikasi.publikasiid.nama_dosen }}</td>
</tr>
{% endfor %}