【问题标题】:django many to many get attributes from other objectdjango 多对多从其他对象获取属性
【发布时间】:2012-03-26 00:55:53
【问题描述】:

所以我使用 django 已经有一段时间了,它很棒。我最近遇到了一点问题,我确信有一种糟糕的方法可以让它工作,但我发现 Django 是它们通常内置了各种机制来做给你的东西。所以我没有找到的是:

这是我的模型:

class LandmarkGroup(models.Model):
    Name = models.CharField(max_length=150)
    Description = models.CharField(max_length=300, blank=True)
    IsActive = models.BooleanField(default=True)
    landmarks = models.ManyToManyField('Landmark', blank=True, null=True)

    def __unicode__(self):
            return self.Name

class Landmark(models.Model):
    Name = models.CharField(max_length=150)
    Description = models.CharField(max_length=300, blank=True)
    Polygon = models.PolygonField()
    IsActive = models.BooleanField(default=True)
    objects = models.GeoManager()

    def __unicode__(self):
            return self.Name

我还有另一个模型“团队”,它与 LandmarkGroup 有一个多对多,但我不打算在这里发布它。我有一个视图,我在其中查询具有 landmarkgroup 的所有地标,该地标组的团队 ID 与我传入的团队具有相同的团队 ID:

def mobile_startup(request):
...
    landmarkGroups = LandmarkGroup.objects.filter(team=device.team, IsActive=True)
    landmarks = Landmark.objects.filter(landmarkgroup__team=device.team, IsActive=True)
...
return render_to_response('webservice/mobile_startup.html', {'landmarks': landmarks, 'landmarkGroups': landmarkGroups})

一切正常,我遇到的唯一问题是,我将这一切作为 JSON 返回到移动应用程序,并且我想为地标提供 landmarkGroup id,所以在我的模板中我一直在尝试:

"landmarkGroup" : {{ landmark.landmarkgroup.id }} }

但这不起作用。有谁知道我可以为我的集合中的每个地标获取 landmarkGroup ID 的任何方式?查询时需要提取吗?我知道我可以在查询中引用每个 landmarkGroup,因为我可以执行 'landmarkgroup__team=device.team',但我需要能够在模板中引用这个对象

【问题讨论】:

    标签: django templates django-templates many-to-many


    【解决方案1】:

    LandmarkGroup.landmarks是一个ManyToManyField,因此一个Landmark可以属于多个组。

    您应该能够像这样在模板中输出它们:

    {% for group in landmark.landmarkgroup_set.all %}{{ group.pk }}{% endfor %}
    

    属于地标的第一组应该可以通过{% landmark.landmarkgroup_set.all.0 %}访问

    【讨论】:

    • 是的,我已经读过了,但我想既然我可以做到Landmark.objects.filter(landmarkgroup__team=device.team, IsActive=True),我应该能够同时获得那个 landmarkgroup 或者至少是 id。
    • @Josh:您可以同时这样做,但由于您的模型设置,仍然多个地标组可以属于地标。如果你想避免这种情况,你应该使用ForeignKey
    • 不,我想要那个。实际上,我曾经以另一种方式设置它(地标组和地标之间的一对多),但我采用这种方式,因此用户每次想要将地标添加到组时都不必重新创建地标。你知道如何在我上面进行查询的同时选择 id 吗?然后如何引用该ID?我找到的最佳答案是定义我自己的中间表并查询该中间表而不是地标表
    • @Josh:如果您想在一个数据库查询中使用多对多关系的中间表来执行此操作,那么您可以使用@987654321 选择其数据@ 在一个查询中。 (如果您想以某种方式为多对多提供相同的功能并愿意更新您的 Django,Django 1.4rc1 为您提供prefetch_related()
    • 所以这种方法的缺点似乎是我不能在管理表单中使用filter_horizontal 了,对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多