2016-03-26 25 views
0

Onlardan birinde fk ile iki tablo var.django queryset anahtarıyla iki tabloya nasıl bağlanır

veli:

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

ve çocuk: Ben biçimli anahtarlar tarafından tabloyu birleştirmek için bir Sorgu Kümesi yapmak gerekir

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

, gibi bir şey:

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

var mı Bunu yapmak için herhangi bir basit yol?

EDIT: Tamam, gerçek örneğe sahip olmam gerektiğini göstereceğim.

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 

ve:

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: ProjectNewForm dan

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', 
     ] 
benim şablona bir selectbox göstermek gerekir

("sunucu" alanına iki model Sunucu ve Kaynaklar vardır) Server modelinden public_name, seçenek etiketi için metin ve bir değer gibi Resources.server.id gibi.

+0

Modelde ForeignKey var mı? Tanımları göster. –

+0

@Daniel Roseman, emin sınıfı Çocuk (modeller. Model): prnt = models.ForeignKey (Üst, on_delete = models.CASCADE) – johndark

+0

Modelin geri kalanıyla birlikte başlamak için bunu göndermelisiniz. Ama hala neyi başarmak istediğini anlamıyorum; Bu birleştirilen sorguyla ne yapmayı umuyorsunuz? –

cevap

0

Sonda gelen ben (Pyha forumdan teşekkürler ppl) nasıl bulundu

Form: Yani

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 
          ) 

, şimdi gibi şablonda sunucu alanını kullanabilirsiniz:

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

ve iyi biçimlendirilmiş bir sonuç elde edin:

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

Emin değilim, belki bu tür bir görev için daha iyi bir çözüm var, ama bu örnek benim için çalışıyor.