95052


以下のようにDjangoのアプリ内models.py,views.pyを記述しました。  
Parsonに、複数のテーブルが外部参照（ForeignKey）されているものとします。  
Parson含め、どれかのテーブルのカラムでfilterして、InnarJoinで一括でデータを取り出したいのですが、どういう構文にすればよいのかが分かりません。

models.py

[code]

    from django.db import models
    import json
    
    class Parson(models.Model):
        name = models.CharField(verbose_name='name',max_length=10)
    
        def __str__(self):
            set_dict = {
                'name':self.name,
            }
            return json.dumps(set_dict)
    
    class ParsonInfo(models.Model):
        gender = models.CharField(verbose_name='gender',max_length=10)
        age = models.IntegerField(verbose_name='age')
        key = models.ForeignKey(Parson,on_delete=models.CASCADE,related_name='parson_key')
    
        def __str__(self):
            set_dict = {
                'gender':self.gender,
                'age':self.age,
            }
            return json.dumps(set_dict)
    
[/code]

views.py

[code]

    from django.shortcuts import render
    from .models import Parson, ParsonInfo
    
    # Create your views here.
    def index(request):
        parson = Parson.objects.filter(ParsonInfo__gender="男性").all()
    
        params = {
            'parson':parson,
        }
        return render(request,'app/index.html',params)
    
[/code]


CC BY-SA 4.0
2023-05-31T08:35:30.757
95041
2023-06-01T01:19:09.453
2023-05-31T09:11:05.893
3060
32891
question
python python3 django
Django　データベースで外部参照をつなげる方法


自己解決したので回答します。

Djangoでは、InnerJoinをデフォルトで発行しているようです。

上記の例では、gender="男性"で絞り込みたい場合には、参照側を使って、

[code]

        parson = ParsonInfo.objects.filter(gender="男性").all()
        for obj in parson:
            print(obj.key.name,obj.age,obj.gender)
    
[/code]

Index.htmlでの取り出しでも同じように.で接続すればよいようです。


CC BY-SA 4.0
2023-06-01T01:04:34.117
95052
2023-06-01T01:19:09.453
2023-06-01T01:19:09.453
32891
32891
95041
answer