1

I want to get data from related foreign-key models, but I am unable to get data from the related model, Please let me know how I can do it. I want to display name value from Model2 table..

here is my models.py file...

class Customer(models.Model):
    cus_name=models.Charfield(blank=True)

class Model1(models.Model):
    namefield=models.Charfield(blank=True)

class Model2(models.Model):
    name=models.CharField(default=None)
    model1=models.Foreignkey(Model1, related_name='model_one', on_delete=models.CASCADE)
   customer=models.Foreignkey(Customer, related_name='customer_data', on_delete=models.CASCADE)

here is my views.py file...

def display_data(request, id):
     test_display=Model1.objects.filter(pk=id).first()
     return render(request, 'page.html', {'test_display':test_display})

here is my test.html file where i am displaying name from Model2 table

<p>{{test_display.model_one.name}}</p>
saini tor
  • 223
  • 6
  • 21

2 Answers2

1

First, instead of filter(...).first(), use get() or get_object_or_404() method:

 from django.shortcuts import get_object_or_404

 def display_data(request, id):
     test_display=get_object_or_404(Model1.objects.prefetch_related('model_one'), pk)  
     # or Model1.objects.prefetch_related('model_one').get(pk=pk)
     return render(request, 'page.html', {'test_display':test_display})

And in the template, use reverse relation to query Model1 instances:

{% for object in test_display.model_one.all %}
    {{ object.name }}
{% endfor %}

As the relation between Model1 and Model2 is many to one due to ForeignKey, you will get multiple Model1 objects from reverse querying Model2 instance. If you want only one object to stored for Model2, then consider using OneToOne relation.

ruddra
  • 50,746
  • 7
  • 78
  • 101
  • it's working perfectly, but I want `Customer` data also from `Model2`, I want to display `name` from the `Customer` model...Please check my updated Question – saini tor Sep 10 '20 at 06:11
  • then use `{{ object.customer.name }}` – ruddra Sep 10 '20 at 07:37
  • It's working Perfect, but above `for loop` giving me output in a single line...eg-`name1 name2` but I want with `comma-separated` like this `name1, name2` – saini tor Sep 10 '20 at 07:55
  • Hello Rudra, could you please solve this issue...https://stackoverflow.com/questions/63840351/how-to-give-permission-in-django – saini tor Sep 11 '20 at 03:23
0

First of all you have to fix your syntax error:

def display_data(request, id):
    test_display = Model2.objects.filter(pk=id).first()
    context = {
        'test_display': test_display
    }
    return render(request, 'page.html', context)

# render instead of ender

second of all try to access the Queryset like so:


<p>{{  test_display.name  }}</p>

JSRB
  • 2,492
  • 1
  • 17
  • 48