1

How do I create a list view that calls multiple classes/models from my model.py file?

I have created my project, and app and my models. The models use a one-to-many relationship.

I am able to create a listview based on calling a single model, but not using multiple models (in this scenario 7 models).

Here are the models I want to call, with the the required model values that I want displayed in the listview are denoted by **:

class TypeAchievement(models.Model):
  typeAchievementID = models.AutoField(primary_key=True, db_column="TypeAchievementID")
  languageCodeID = models.ForeignKey(LanguageCode, db_column="LanguageCodeID")
  **typeAchievementDescriptionIntl = models.CharField(max_length=255, db_column="TypeAchievementDescriptionIntl")**
  typeAchievementDescriptionEng = models.CharField(max_length=255, db_column="TypeAchievementDescriptionEng")
  typeAchievementAltID = models.IntegerField(db_column="TypeAchievementAltID")
  class Meta:
    db_table="TypeAchievement"

class RIAchievement(models.Model):
  riAchievementID = models.AutoField(primary_key=True, db_column="RIAchievementID")
  userLanguageVersionID = models.ForeignKey(UserLanguageVersion, db_column="UserLanguageVersionID")
  typeAchievementID = models.ForeignKey(TypeAchievement, db_column="TypeAchievementID")
  **riAchievementTypeUserDescription = models.CharField(max_length=255, blank=True, null=True, db_column="RIAchievementTypeUserDescription")**
  **riAchievementDescription = models.TextField(max_length=2000, db_column="RIAchievementDescription")**
  auth_user_id = models.ForeignKey(auth_user, db_column="auth_user_id")
  class Meta:
    db_table="RIAchievement"

class UserLanguageVersion(models.Model):
  userLanguageVersionID = models.AutoField(primary_key=True, db_column="UserLanguageVersionID")
  auth_user_id = models.ForeignKey(auth_user, db_column="auth_user_id")
  languageCodeID = models.ForeignKey(LanguageCode, db_column="LanguageCodeID")
  class Meta:
    db_table="UserLanguageVersion"

class auth_user(models.Model):
  **auth_user_id = models.AutoField(primary_key=True, db_column="id")**
  username = models.CharField(max_length=30, unique=True, db_column="username")
  first_name = models.CharField(max_length=30, db_column="first_name")
  last_name = models.CharField(max_length=30, db_column="last_name")
  email = models.CharField(max_length=75, db_column="email")
  password = models.CharField(max_length=128, db_column="password")
  is_staff = models.BooleanField(db_column="is_staff")
  is_active = models.BooleanField(db_column="is_active")
  is_supervisor = models.BooleanField(db_column="is_supervisor")
  last_login = models.DateTimeField(db_column="last_login")
  date_joined = models.DateTimeField(db_column="date_joined")
  class Meta:
    db_table="auth_user"

class LanguageCode(models.Model):
  languagecodeID = models.AutoField(primary_key=True, db_column="LanguageCodeID")
  **languageCodeDescription = models.CharField(max_length=10, db_column="LanguageCodeDescription")**
  baseLanguageCode = models.CharField(max_length=10, db_column="BaseLanguageCode")
  languageNameEng = models.CharField(max_length=255, db_column="LanguageNameEng")
  altLanguageNameEng = models.CharField(max_length=255, blank=True, null=True, db_column="AltLanguageNameEng")
  **languageNameNative = models.CharField(max_length=255, db_column="LanguageNameNative")**
  altLanguageNameNative = models.CharField(max_length=255, blank=True, null=True, db_column="AltLanguageNameNative")
  **iso639_1 = models.CharField(max_length=10, blank=True, null=True, db_column="ISO639_1")**
  iso639_2T = models.CharField(max_length=10, db_column="ISO639_2T")
  iso639_2B = models.CharField(max_length=10, db_column="ISO639_2B")
  iso639_X = models.CharField(max_length=10, db_column="ISO639_X")
  languageDirectionID = models.ForeignKey(LanguageDirection, default=1, db_column="LanguageDirectionID")
  class Meta:
    db_table="LanguageCode"

class LanguageDirection(models.Model):
  languageDirectionID = models.AutoField(primary_key=True, db_column="LanguageDirectionID")
  **languageDirectionDescription = models.CharField(max_length=20, db_column="LanguageDirectionDescription")**
  **languageDirDescription = models.CharField(max_length=20, db_column="LanguageDirDescription")**
  **textAlign = models.CharField(max_length=20, db_column="TextAlign")**
  **oppositeLanguageDirectionDescription = models.CharField(max_length=20, db_column="OppositeLanguageDirectionDescription")**
  **oppositeLanguageDirDescription = models.CharField(max_length=20, db_column="OppositeLanguageDirDescription")**
  **oppositeTextAlign = models.CharField(max_length=20, db_column="OppositeTextAlign")**
  class Meta:
    db_table="LanguageDirection"

class Flag(models.Model):
  flagID = models.AutoField(primary_key=True, db_column="FlagID")
  languageCodeID = models.ForeignKey(LanguageCode, db_column="LanguageCodeID")
  **flagIconPath = models.CharField(max_length=255, db_column="FlagIconPath")**
  flagDescription = models.CharField(max_length=255, db_column="FlagDescription")
  flagInformation = models.CharField(max_length=255, db_column="FlagInformation")
  class Meta:
    db_table="Flag"

1 Answer 1

3

You can get linked objects from the main one. In your case - iterate over list of RIAchievement and get other data as {{ riachievement.userLanguageVersionID.languageCodeID.languageDirectionID.textAlign }}

P.S. Also, please format code according to pep8 even it is autogenerated from the database.

Sign up to request clarification or add additional context in comments.

5 Comments

ilvar, thanks for the answer. The solution you provided is not working for me. Do I have to import any data to display the extra fields? P.S. I was forced to format my laptop, and re-establish my project, which is why this request is so delayed.
No, you don't need any imports. It should be working because it's pretty straightforward. Show how are you sending achievment list to template and how are you iterating over it in the template.
Here is how I am iterating: {% if qs %} {% for q in qs %} <td> {{ riachievement.typeAchievementID.typeAchievementDescriptionIntl }} </td> {% endfor %} {% endif %}
This is how I am sending: from django.shortcuts import render from app_data.models import RIAchievement def ri_achievements(request): #qs = RIAchievement.objects.all() qs = RIAchievement.objects.select_related("typeAchievement").all() return render(request, 'index.html',{'qs': qs})
So why are you displaying relatives of riachievement, if real varianble from {% for %} is q?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.