ranggatry
ranggatry

Reputation: 125

select_related django. Why i can't using select_related in my project?

i'm new in django. And i am trying to use django ORM instead of raw sql.

This is my models:

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'

And consider of my models. I try to create a view like this:

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)

And then i send my data views to my html template:

 {% 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 %}

My question:

  1. Why in the result there is no data that is displayed? am i wrong in query?
  2. if i'm wrong. Please tell me what is the right query that can display the data?

Because i feel i'm wrong in my views here

 publikasi = DosenPublikasi.objects.select_related().get(userid=username_session)

Thank you very much. Your input would be helpful

Upvotes: 0

Views: 957

Answers (1)

Alasdair
Alasdair

Reputation: 308949

DosenPublikasi.objects.get() returns a single DosenPublikasi. Calling select_related() will follow foreign keys from DosenPublikasi to reduce the number of SQL queries, but it will still return a single DosenPublikasi.

If there can be multiple DosenPublikasi for each user, then use filter() instead of get()

publikasi = DosenPublikasi.objects.select_related().filter(userid=username_session)

Then, in your template, when you loop through object_list, you will be looping through DosenPublikasi, not Publikasi. You need to follow the foreign key to access the Publikasi fields. For example:

{% for dosen_publikasi in object_list %}
<tr>
    <td>{{ dosen_publikasi.publikasiid.nama_dosen }}</td>
</tr>
{% endfor %}

Upvotes: 1

Related Questions