【问题标题】:Django printing many to many children not in same order as inputDjango以与输入不同的顺序打印多对多的孩子
【发布时间】:2023-03-29 03:39:01
【问题描述】:

我有一个Tourguide 模型与Places 具有多对多关系。两种模型都定义为:

class Tourguide(models.Model):
    id = models.AutoField(db_column='ID', primary_key=True, unique=True)
    title = models.CharField(db_column='Title', max_length=255, blank=True)
    places = models.ManyToManyField(Place, db_column='placesdj')
    places_app = models.CharField(max_length=255, db_column='places')
    created_on = models.DateTimeField(db_column='Created_On', default = now)

    class Meta:
        managed = False
        db_table = 'tourguide'

    def __str__(self):
        return self.title

class Place(models.Model):
   place_id = models.AutoField(db_column='ID', primary_key=True)
   place_name = models.CharField(db_column='Place_Name', max_length=255)
   address_line_1 = models.CharField(db_column='Address_Line_1', max_length=255)
   address_line_2 = models.CharField(db_column='Address_Line_2', max_length=255)
   area = models.CharField(db_column='Area', max_length=255)


   class Meta:
       managed = False
       db_table = 'Place'

   def __str__(self):
       return self.place_name

问题

当我尝试使用 tourguide 打印 places 时:

{% for place in tour.places.all %}
    <tbody>
    <td>{{ forloop.counter }}</td>
    <td>id: {{place.place_id}}, {{ place.place_name }} </td>
    <td> {{ place.description }} </td>
    </tbody>
{% endfor %}

地点的顺序都是随机的,与我输入的顺序不同。我想按照放置它们的顺序打印这些地方。我对列出导游和其中的地方的看法是这样的。

def tour_list(request, template_name='tourguides/tour_list.html'):
    tourguide_list = Tourguide.objects.all()
    paginator = Paginator(tourguide_list,6)
    page = request.GET.get('page')
    tourguides = paginator.get_page(page)
    data = {}
    data['tourguides'] = tourguides

    return render(request, template_name, data)

更新 我在导游表中有一组地点 ID,有什么方法可以使用它吗?

【问题讨论】:

    标签: django many-to-many manytomanyfield m2m


    【解决方案1】:

    关系型数据库默认不会对行进行排序,而且由于它们内部存储在各种奇怪的数据结构中,因此也没有“输入顺序”。

    作为一种解决方法,您可以使用自动生成的place_id 字段作为排序键,因为它几乎可以保证随着新条目的创建而上升。您可以为 Place 类添加默认排序,例如:

    class Place(models.Model):
       ...
    
       class Meta:
           ...
           ordering = ('place_id',)
    

    这将保证任何将返回 Place 查询集的查询默认按 place_id 排序(即,除非您有明确的 .order_by() 子句)。

    【讨论】:

    • 我不确定这是否可行,例如,如果我创建一个导游并按 [Place 3, Place 1, Place 10] 的顺序添加地点,您的解决方案是否会返回 [Place _1 , Place_3, Place_10] 而不是它们输入的顺序?
    • 为什么?因为place_idAutoField,所以1 对应Place 32 对应Place 13 对应Place 10(假设没有以前的记录)。
    • 地点已经创建,它们不是正在生成的新记录。所以按顺序排序是行不通的,因为它只会以与输入顺序不同的 ID 顺序返回它们
    • 您是否手动分配了place_ids 而不是使用数据库的自动增量功能?在这种情况下,该表中没有任何内容与输入顺序相关。
    • 否,所以添加 ordering = ('place_id',) 产生的问题是,当您要创建导游时,它会强制按 place_id 对地点的顺序进行排序。有没有办法让它只在查看导游时订购而不是在输入时订购??
    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多