Django正确处理反向外键查找的方法

时间:2015-11-07 13:10:19

标签: python django

这花了我几个小时,我第一次这样做了。因为这将在未来很多次发生,我只是想知道这是否是在Django中处理反向查找的正确方法。

在models.py中,我有一个Activities类和一个ActivitiesThumbnail类。 在Activity类中,我创建了一个静态方法来获取相应的活动缩略图和一个获取所有活动的方法。

class Activity(models.Model):
    name = models.CharField(max_length=50, verbose_name="Naam", null=True)

    @staticmethod
    def get_all_activities():
        activities_list = Activity.objects.all()
        return activities_list    

    @staticmethod
    def get_activity_thumbnail(activity):
        image = ActivityThumbnail.objects.get(activity__id__exact=activity.id)
        return image


class ActivityThumbnail(Image):
    upload_dir = 'static/uploads/images/thumbnails/activities'
    activity = models.ForeignKey(Activity, blank=True, null=True)

在views.py中,我首先创建一个包含所有活动的列表。 接下来,我创建一个名为activities_list_with_images的列表,并使用for循环使用包含活动对象和相应图像对象的列表填充该列表。

def activities(request):
    activities_list = Activity.get_all_activities()
    activities_list_with_images = []
    for activity in activities_list:
        activities_list_with_images.append([activity, Activity.get_activity_thumbnail(activity)])

    context = {'city_id': city_id,
               'activities_list': activities_list,
               'activities_list_with_images': activities_list_with_images}
    return render(request, 'hotel/activities.html', context)

在activities.html中,我调用activities_list_with_images列表并使用foreach循环将它们全部显示在屏幕上。

{% for activity in activities_list_with_images %}
    <div>
        <p>{{ activity.0.short_description }}</p>
        <img src="/{{ activity.1.image }}">
    </div>
{% endfor %}

这种方式运行得很好,但我想知道这是否是正确的方法。

1 个答案:

答案 0 :(得分:0)

正如您所料,有一种更简单的方法可以使反向查找工作。

只要在两个模型之间创建一个ForeignKey,就可以从另一个模型中访问它们:

  1. 从活动到ActivityThumbnail:activity.activitythumbnail_set.all()
  2. 从ActivityThumbnail到Activity:activitythumbnail.activity
  3. 这有意义吗?