2017-10-01 5 views
1

J'ai googlé plusieurs heures mais je ne pouvais pas comprendre comment écrire des requêtes liées à la jointure sql (raw ou ORM).comment écrire une requête de jointure dans django?

Ci-dessous est mon modèle avec deux tables sandBox1 et LICENSETYPE où ils auront "email" de l'article commun sur lequel jointure sera effectué

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() 
fichier modèle

: index.html

<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> 

ici est un fichier de vue qui a besoin de correction. Je veux montrer le résultat de cette requête SQL:

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

Voir fichier

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

Votre modèle 'licenseType' n'a pas de champ email. –

+0

désolé je l'ai corrigé –

+0

pourquoi voudriez-vous rejoindre sur un 'EmailField'? Cela ne semble pas être une bonne idée car vous n'appliquez pas l'unicité et vous pourriez donc avoir plusieurs jointures par élément. Pourquoi ne pas extraire le 'EmailField' dans un modèle et utiliser' ForeignKey' à la place? – olieidel

Répondre

1

méthode sql Raw/mais im encore confus sur la méthode 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

Sauf si vous avez une raison impérieuse de le faire, arrêtez de perdre votre temps avec raw sql et apprenez à utiliser les modèles django (faire le tutoriel et lire le doc va certainement aider). Et si vous insistez pour utiliser raw sql, utilisez 'django.db.connection' au lieu de tout coder en dur. –

0

Désolé si cela répond à la mauvaise question, mais vous voudrez peut-être envisager un autre modèle de données/architecture. Vous êtes codé en dur SANDBOX1, ce qui implique qu'il peut y avoir plusieurs Sandbox et que vous répertoriez les champs de courrier électronique qui ne sont pas liés à l'objet Utilisateur. Certaines abstractions de base peuvent simplifier le travail. Peut-être quelque chose comme:

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) 

J'aime mieux cette architecture car elle utilise beaucoup plus de fonctionnalités django natives. Et rend les jointures vraiment basiques. Regardez ceci dans une vue:

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

Merci @sahutchi je pourrais votre réponse à comprendre en utilisant joindre dans django. Im en utilisant le modèle ci-dessus juste pour pratiquer le modèle django et doe select avec des jointures –