2016-03-26 6 views
0

Ich habe zwei Tabellen mit fk in einem von ihnen.Wie zwei Tabellen durch Tasten in Django QuerySet verbunden werden

parent:

+----+---------+ 
| Id | Name | 
+----+---------+ 
| 1 | Test #1 | 
| 2 | Test #2 | 
| 3 | Test #3 | 
+----+---------+ 

und Kind:

+----+---------+-----------+ 
| Id | Traffic | parent_id | 
+----+---------+-----------+ 
| 1 | 1000 |   1 | 
| 2 | 2000 |   3 | 
+----+---------+-----------+ 

Ich brauche eine queryset zu machen für meine Form Tabellen durch Tasten zu verbinden, so etwas wie:

select p.parent_id, p.traffic, c.name from child c, parent p where c.parent_id = p.id 

Gibt es eine einfache Möglichkeit, es zu tun?

BEARBEITEN: Ok, ich werde echte Probe zeigen, was ich haben muss. Es gibt zwei Modelle Server und Ressourcen:

class Server(models.Model): 
    public_name = models.CharField(_(u'public name'), 
            max_length=60, 
            blank=False, 
            null=False, 
            unique=False) 
    server_ident = models.CharField(_(u'server identificator'), 
            max_length=100, 
            blank=False, 
            null=False, 
            unique=True) 
    class Meta: 
     db_table = 'server' 
     ordering = ('public_name',) 
     abstract = False 

    def __unicode__(self): 
     return self.public_name 

und:

class Resources(models.Model): 
    server = models.ForeignKey(Server, 
           on_delete=models.CASCADE) 
    traffic_left = models.FloatField(_(u'traffic left'), 
            blank=False, 
            null=False, 
            default=0.0) 
    requests_left = models.IntegerField(_(u'requests left'), 
             blank=False, 
             null=False, 
             default=0) 
    class Meta: 
     db_table = 'resources' 
     abstract = False 

Form:

class ProjectNewForm(forms.Form): 
    servers_query = Resources.objects.all()........ 
    project_name = forms.CharField(required=True, 
            min_length=2, 
            max_length=14, 
            label=_(u'Project name')) 
    project_description = forms.CharField(required=True, 
              max_length=2000, 
              widget=forms.Textarea(
               attrs={'rows': 4} 
             ), 
              label=_(u'Project description')) 

    server = forms.ModelChoiceField(queryset=servers_query, 
            required=True, 
            initial=0, 
            widget=forms.Select, 
            label=_(u'Server')) 
    class Meta: 
     fields = [ 
      'project_name', 
      'project_description', 
      'server', 
     ] 

ich auf meiner Vorlage, um einen selectbox zeigen muß ("Server" Feld von ProjectNewForm) Was enthält public_name von Server-Modell wie Text für Options-Tag und Resources.server.id wie ein Wert.

+0

Haben Sie einen ForeignKey im Modell? Zeigen Sie die Definitionen an. –

+0

@Daniel Roseman, sicher Klasse Kind (models.Model): prnt = models.ForeignKey (Eltern, on_delete = models.CASCADE) – johndark

+0

Sie sollten das zusammen mit den anderen Modellen, um mit zu beginnen, gepostet haben. Aber ich verstehe immer noch nicht, was du erreichen willst; Was erhoffen Sie sich mit dieser verbundenen Abfrage? –

Antwort

0

Finaly fand ich, wie es (dank ppl aus pyha Forum) zu tun

Form:

def get_server_list(): 
    return Resources.objects.all().values_list('server_id', 
               'server__public_name') 

class ProjectNewForm(forms.Form): 
    project_name = forms.CharField(required=True, 
            min_length=2, 
            max_length=14, 
            label=_(u'Project name')) 
    project_description = forms.CharField(required=True, 
              max_length=2000, 
              widget=forms.Textarea(
               attrs={'rows': 4} 
             ), 
              label=_(u'Project description')) 
    server = forms.Field(required=True, 
         widget=forms.Select, 
         label=_(u'Server')) 

    class Meta: 
     fields = [ 
      'project_name', 
      'project_description', 
      'server', 
     ] 

    def __init__(self, *args, **kwargs): 
     kwargs.setdefault('label_suffix', '') 
     super(ProjectNewForm, self).__init__(*args, **kwargs) 
     self.fields['server'] = \ 
      forms.ChoiceField(choices= 
           [(o[0], str(o[1])) for o in get_server_list()], 
           initial=1 
          ) 

, jetzt So kann ich Server-Feld in der Vorlage wie verwenden:

{% render_field form.server class="form-control required" %} 

und erhalten gut gebildet Ergebnis:

<select class="form-control required" name="server"> 
    <option value="1">Test #1</option> 
    <option value="3">Test #3</option> 
</select> 

Ich bin nicht sicher, vielleicht gibt es eine bessere Lösung für diese Art von Aufgabe, aber dieses Beispiel funktioniert für mich.