Django-多对多字段查询

时间:2012-02-07 18:07:39

标签: django django-models django-forms django-views

我在django中有以下模型结构:

class BodySubPart(models.Model):
    body_subpart=models.CharField(max_length=20)
    def __str__(self):
        return self.body_subpart

class BodyPart(models.Model):   
    body_part=models.CharField(max_length=20)
    body_subpart=models.ManyToManyField(BodySubPart)
    def __str__(self):
        return self.body_part

例如:

example,
if BodyPart=head then BodySubPart= face,mouth,eyes,nose.
if BodyPart=arm then BodySubPart= shoulder,fingers,elbow.
像这样存储许多身体部位。 ... 现在我想创建一个运行时表单有两个选择字段(BodySubPart和BodyPart),这样当我选择BodyPart时,它应该更改BodySubPart中的列表。 实施例

The first choicefield has body parts={head,arm,chest...}
The second choice field should change when i select a particular part 
If i select "head" then second choice field should show,
body sub parts={face,mouth,eyes,nose...}

请在这帮帮我.....

3 个答案:

答案 0 :(得分:1)

你有什么尝试?我想你会发现,如果你自己尝试过一些东西而不仅仅是希望别人为你做这件事,那么人们会更愿意帮助你。它应该是这样的:

1)    BodyPart.objects.all() # all body parts
2)    head = BodyPart.objects.get(body_part='head')
      head_subparts = head.body_subpart.all() # all head subparts

django在解释如何查询这些关系方面做得很好。 https://docs.djangoproject.com/en/dev/topics/db/models/#many-to-many-relationships 此外,还有很多关于djangos的多种关系的在线教程。

答案 1 :(得分:1)

这需要一些AJAX,所以第一步是创建一个视图来处理:

from django.core import serializers
from django.http import HttpResponse, HttpResponseBadRequest
from django.shortcuts import get_list_or_404

def ajax_get_bodysubparts(request):
     bodypart_id = request.GET.get('bodypart_id')

     if bodypart_id:
         bodysubparts = get_list_or_404(BodySubPart, bodypart__id=bodypart_id)
         data = serializers.serialize('json', bodysubparts)
         return HttpResponse(data, mimetype='application/json')
     else:
         return HttpResponseBadRequest()

将其与urls.py中的某个网址绑定。然后,为您的表单的一些JavaScript(假设jQuery):

$(document).ready(function(){
    $('#id_bodypart').change(function(){
        var selected = $(this).val();
        if (selected) {
            $.getJSON('/url/to/ajax/view/', {
                'bodypart_id': selected
            }, function (data, jqXHR) {
                options = [];
                for (var i=0; i<data.length; i++) {
                    options.append('<option value="'+data[i].id+'">'+data[i].body_subpart+'</option>');
                }
                $('#id_bodysubpart).html(options.join(''));
            });
        }
    });
});

答案 2 :(得分:0)

您可能需要自定义表单字段和小部件的组合才能获得所需内容。

查看django-ajax-filtered-fields项目,看看它是否接近你要找的东西。如果你决定创建自己的,它至少会提供一些指导。

您需要一些javascript来发出动态填充字段的新请求,因此标准django表单也无法使用。