2017-10-01 18 views
1

私は数時間googledが、SQL結合(生ORM)関連のクエリを書く方法を理解できませんでした。以下はdjangoで結合クエリを書く方法?

二つのテーブル、彼らが参加した上で、共通の項目「電子メール」は

class sandBox1(models.Model): 
    email = models.EmailField(unique=True) 
    name = models.CharField(max_length=200) 
    website = models.TextField(validators=[URLValidator()]) 
    comment = models.TextField(default='-') 
    gender = models.CharField(max_length=6) 
    def __str__(self): 
     return self.email 

class licenseType(models.Model): 
    #1=other, 2=two-wheeler 4=four-wheeler 
    licenseId = models.IntegerField() 
    email = models.EmailField() 

テンプレートファイルに実行されますがありますsandBox1とLICENSETYPEと私のモデルである:

ここ
<html><form id="form1" method="post" action="{% url "sandbox" %}"> 
    {% csrf_token %} 
    Name: <input type="text" name="name" > 
    <br><br> 
    E-mail: <input type="text" name="email"> 
    <br><br> 
    Website: <input type="text" name="website" > 
    <span class="error"></span> 
    <br><br> 
    Comment: <textarea name="comment" rows="5" cols="40"></textarea> 
    <br><br> 
    Gender: 
    <input type="radio" name="gender" value="female">Female 
    <input type="radio" name="gender" value="male">Male 
    <hr>Check the license type you have:-<br> 
    <input type="checkbox" name="license[]" value=2 > 2 wheeler<br> 
    <input type="checkbox" name="license[]" value=4 > 4 wheeler<br> 
    <input type="checkbox" name="license[]" value=1 > Other <br> 
    <br> 
    <input type="submit" name="submit" value="Submit"> 
</form> 
<div> 
    {% for obj in sandBoxObj %} 
     <p> 
     {{ obj.name }}<br> 
     {{ obj.email }}<br> 
     {{ obj.website }}<br> 
     {{ obj.gender }}<br> 
     {{ obj.comment }}<br> 
    {% endfor %} 
</div> 
</html> 

のindex.htmlを訂正が必要なビューファイルです。これが答えた場合

select sandBox1.email,sandBox1.name,licenseType.licenseId from sandBox1 
innerjoin licenseType on sandBox1.email=licenseType.email; 

ビューファイル

def sandbox(request): 
template_name='domdom.html' 
sandBoxObj = sandBox1.objects.all() 
context = { 'sandBoxObj':sandBoxObj } 
print request.POST 
if request.method == 'POST': 
    website=request.POST.get('website','') 
    comment=request.POST.get('comment','') 
    name=request.POST.get('name','') 
    gender=request.POST.get('gender','') 
    email=request.POST.get('email', '') 
    license=request.POST.getlist('license[]') 
    for id in license: 
     licInst = licenseType(licenseId=id,email=email) 
     licInst.save() 
    sbinstance = sandBox1(website=website,comment=comment,name=name,gender=gender,email=email) 
    sbinstance.save() 

    return render(request,template_name,context) 
+0

モデル 'licenseType'には電子メールフィールドがありません。 –

+0

申し訳ありません私はそれを訂正しました –

+0

なぜあなたは 'EmailField'に参加したいですか?一意性を強制していないので、良いアイデアのようには聞こえません。そのため、アイテムごとに複数の結合が行われる可能性があります。 'EmailField'をモデルに抽出し、代わりに' ForeignKey'を使うのはなぜですか? – olieidel

答えて

1

生のSQLメソッド/しかしORM方法

def sandbox(request): 
    template_name='domdom.html' 
    sandBoxObj = sandBox1.objects.all() 
    con = sqlite3.connect('/home/user1/PycharmProjects/djrest/invoicesproject/db.sqlite3') #sqlite database file location 
    cursor = con.cursor() 
    cursor.execute(''' select todos_sandBox1.email,todos_sandBox1.name,todos_sandBox1.website,todos_sandBox1.comment,todos_sandBox1.gender,todos_licenseType.licenseId from todos_sandBox1 
join todos_licenseType on todos_sandBox1.email=todos_licenseType.email 
''') #it looks like django appends app name to table eg. appname = todos 
    result = cursor.fetchall() 
    #https://www.youtube.com/watch?v=VZMiDEUL0II 
    context = { 'result':result } 
    print request.POST 
    if request.method == 'POST': 
     website=request.POST.get('website','') 
     comment=request.POST.get('comment','') 
     name=request.POST.get('name','') 
     gender=request.POST.get('gender','') 
     email=request.POST.get('email', '') 
     license=request.POST.getlist('license[]') 
     for id in license: 
      licInst = licenseType(licenseId=id,email=email) 
      licInst.save() 
     sbinstance = sandBox1(website=website,comment=comment,name=name,gender=gender,email=email) 
     sbinstance.save() 
    return render(request,template_name,context) 
+0

魅力的な理由がない限り、raw SQLを使用して時間を無駄にすることをやめ、djangoモデルの使用方法を学んでください(チュートリアルをやり、ドキュメントを読むことは間違いありません)。また、raw SQLを使用することを強く要求する場合は、少なくともすべてをハードコーディングするのではなく、 'django.db.connection'を使用してください。 –

0

申し訳上、まだ混乱してイム:私は、このSQLクエリの結果を表示したいです間違った質問ですが、別のデータモデル/アーキテクチャを検討したいかもしれません。 SANDBOX1をハードコーディングしています。これは、複数のサンドボックスがあり、Userオブジェクトに関連付けられていない電子メールフィールドをリストしていることを意味しています。いくつかの基本的な抽象化によって、作業が簡単になる場合があります。おそらく次のようなものでしょう:

from django.contrib.auth.models import User 
... 

class LicenseTypes(models.Model): 
    name = models.CharField(max_length=500) 
class Customer(models.Model): 
    name = models.CharField(max_length=500) 
    license = models.ForeignKey(LicenseType) 
class RegisteredUser(models.Model): 
    customer = models.ForeignKey(Customer, on_delete = models.CASCADE) 
    user = models.ForeignKey(User) 

私は、より多くのネイティブのジャンゴ機能を使用しているので、このアーキテクチャーがより好きです。そして、結合を本当に基本的にする。ビューでこれを確認してください:

def django_view(request): 
    registered_user = RegisteredUser(user=request.user) 
    #example of how to use the join implicitly/ directly 
    license = registered_user.customer.license.name 
+0

ありがとう@sahutchi私はあなたの答えは、djangoの結合を使用して理解することができます。私は上記のモデルを使用してちょうどdjangoモデルとdoeを選択してジョインを練習する –

関連する問題