简体   繁体   中英

How to make multiple join the Django query

I am new to Django platform. I have a situation where I need to show the data on a page where the table has multiple foreign key columns like status, Priority and task type.when I save the date it saves the ID from the Foreign key table like StatusTable, PriorityTable and TaskTypeTable.The save is working fine as expected.But when I retrieve the date from the table it's giving only the ID not the name. How can i achieve this in Django?

Modle.py

class StatusTable(models.Model):
    status = models.CharField(max_length=20,default='')
    def __str__(self):
       return self.status

class PriorityTable(models.Model):
    priority = models.CharField(max_length=20,default='')
    def __str__(self):
        return self.priority

class TeamTable(models.Model):
    team = models.CharField(max_length=20,default='')
    def __str__(self):
        return self.team

class TaskTypeTable(models.Model):
    tasktype = models.CharField(max_length=30,default='')
    def __str__(self):
        return self.tasktype

class DatacenterTable(models.Model):
    datacenter = models.CharField(max_length=10,default='')
    def __str__(self):
        return self.datacenter


class TaskMaster(models.Model):
  sid = models.CharField(max_length=3)
  processor = models.ForeignKey(User,null=True)
  tasktype = models.ForeignKey(TaskTypeTable, null=True)
  task_title = models.TextField(null=True)
  task_description = models.TextField(null=True)
  datacenter = models.ForeignKey(DatacenterTable,null=True)
  priority = models.OneToOneField(PriorityTable, null=True)
  status = models.ForeignKey(StatusTable, null=True)
  pid = models.IntegerField(null=True)
  sourceincident = models.URLField(null=True)
  errorincident = models.URLField(null=True)
  processingteam = models.ForeignKey(TeamTable, null=True)
  createddate = models.DateField(("Date"), default=datetime.date.today)
  duedate = models.DateField(("Date"), default=datetime.date.today)
  istaskactive = models.BooleanField(default=True)

forms.py

class CreateTaskMaster(forms.Form):
    sid = forms.CharField(required=False,widget=forms.TextInput(attrs={'class': 'form-control mr-sm-2', 'placeholder': 'SID'}))

    tasktype_query = TaskTypeTable.objects.values_list('tasktype', flat=True).distinct()
    tasktype_query_choices = [('', 'Select TaskType')] + [(region, region) for region in tasktype_query]
    tasktype = forms.ChoiceField(tasktype_query_choices, required=True,widget=forms.Select(attrs={'class': 'form-control'}))

    task_title = forms.CharField(widget=forms.Textarea(attrs={'class': 'form-control mr-sm-2', 'placeholder': 'Task Title', 'rows':4}))

    task_description = forms.CharField(widget=forms.Textarea(attrs={'class': 'form-control mr-sm-2', 'placeholder': 'Task Description', 'rows':4}))

    datacenter_query = DatacenterTable.objects.values_list('datacenter', flat=True).distinct()
    datacenter_query_choices = [('', 'Select datacenter')] + [(region, region) for region in datacenter_query]
    datacenter = forms.ChoiceField(datacenter_query_choices, required=True,widget=forms.Select(attrs={'class': 'form-control'}))

    priority_query = PriorityTable.objects.values_list('priority', flat=True).distinct()
    priority_query_choices = [('', 'Select priority')] + [(region, region) for region in priority_query]
    priority = forms.ChoiceField(priority_query_choices, required=True,widget=forms.Select(attrs={'class': 'form-control'}))

    sourceincident = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control mr-sm-2', 'placeholder': 'Source Incident URL or NO'}))

    processingteam_query = TeamTable.objects.values_list('team', flat=True).distinct()
    processingteam_query_choices = [('', 'Select processingteam')] + [(region, region) for region in processingteam_query]
    processingteam = forms.ChoiceField(processingteam_query_choices, required=True,widget=forms.Select(attrs={'class': 'form-control'}))

    duedate = forms.DateField(widget=forms.TextInput(attrs={'class': 'form-control mr-sm-2', 'placeholder': 'Due Date'}))

views.py

form = CreateTaskMaster()
task_title = TaskMaster.objects.filter()
my_list = [ model_to_dict(x) for x in task_title]
print(my_list)
print(my_list[1]['sid'])
return render(request, 'task/task.html', {'form': form, 'sid':my_list})

在此处输入图片说明

whenever you ForeignKey is used in model it's add Primary Key of that table to record

Example

 class TaskMaster(models.Model):
     status = models.ForeignKey(StatusTable, null=True)

 class StatusTable(models.Model):
     status = models.CharField(max_length=20,default='')
     def __str__(self):
        return self.status

when a new record is added to TaskMaster the status field require an instance of StatusTable but when you look at your database the status field is just Integer number (Primary Key of StatusTable )

if dirctly convert TaskMaster do dictionary you will get Primary Key (an Number) that's why you need Serializers but for know use this code .

my_list = [ model_to_dict(x)['status'] = x.status.status for x in task_title] 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM