前提・実現したいこと
Djangoの中間テーブルを追加した順番(ID順)でソートしたいです。
Productテーブルに対し、タグを追加していますが、
追加したタグの順番で抽出を行う方法はございますでしょうか?
該当のソースコード
models
class Tag(models.Model): tid = models.BigIntegerField("タグID", primary_key=True) name = models.CharField("名前", max_length=18, default='', blank=True) class Meta: db_table = 'Tag' class Product(models.Model): pid = models.BigIntegerField("プロダクトID", primary_key=True) tags = models.ManyToManyField(Tag, verbose_name="タグ", related_name='tags', blank=True) class Meta: db_table = 'Product'
タグとプロダクトオブジェクトの追加
tag2 -> tag1の順番で保存しています。
python3
1tag1 = Tag.objects.create(tid=1, name='test1') 2tag2 = Tag.objects.create(tid=2, name='test2') 3 4product = Product.objects.create(pid=1) 5product.tags.add(tag2) 6product.tags.add(tag1) 7product.save()
中間テーブル
select * from Product_tags; +----+------------+--------+ | id | product_id | tag_id | +----+------------+--------+ | 2 | 1 | 1 | | 1 | 1 | 2 | +----+------------+--------+
追加したプロダクトに設定しているタグ名リストを取得
product = Product.objects.get(pid=1) print(list(product.tags.values_list('name', flat=True))) ['test1', 'test2']
追加した順番で['test2', 'test1']と出力されるのが期待動作です。
試したこと
order_by('tags__pk')でソートを行ってもProduct_tags
.product_id
がキーとなってしまいます。
※Product_tagsのPrimaryKeyはIDなのになぜ...?
Product_tags
.id
でソートできる方法はございますでしょうか?
print(list(product.tags.order_by('tags__pk').values_list('name', flat=True))) SELECT `Tag`.`name` FROM `Tag` INNER JOIN `Product_tags` ON (`Tag`.`tid` = `Product_tags`.`tag_id`) WHERE `Product_tags`.`product_id` = 1 ORDER BY `Product_tags`.`product_id` ASC
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/14 06:32
退会済みユーザー
2021/05/14 09:54