Django-仅在存在字段时删除重复项
Django- Remove duplicates only if a field is present
我有两个模型:
class BookSeries(models.Model):
title = models.CharField(max_length=200, null=False, blank=False, unique=True)
#extra fields
class Book(models.Model):
series = models.ForeignKey(BookSeries, blank=True, null=True, default=None)
publisher = models.ForeignKey(Publisher, default=None, null=True, blank=True)
title = models.CharField(max_length=200, null=False, blank=False, unique=True)
#extra fields
现在我想查询所有不属于一个系列的书,并且只查询属于同一个系列的任何一本书(系列可以为空)。
问题陈述:
我想查询所有单本和丛书。
由于一个系列可以有多本书,而一本书可能不属于一个系列。解决方案之一是查询所有书籍对象(不属于系列)并查询所有系列对象,如here所述。但这会在响应中将所有系列和书籍放在一起。我不想把它们组合在一起(我也在使用分页)。
类似于:Book.objects.filter( disctinct only if(series is not None))
我想过使用 distinct 和 exclude,但没用。
我建议采用以下方法:
获取不属于series
的所有图书的id:
ids_list1 = list(Book.objects.filter(series=None).values_list('id', flat=True))
获取属于 series
的所有书籍的 ID,并且仅首先使用 distinct
:
ids_list2 = list(Book.objects
.exclude(series=None) # exclude ones which are not in a series
.order_by('series') # order by series
.distinct('series') # keep the first book in each series
.values_list('id', flat=True))
现在,您可以合并这两个列表并再次查询 return 仅具有这些 ID 的图书:
ids = id_list1 + id_list2
books = Book.objects.filter(id__in=ids)
如果系列是 None,首先排除所有,然后调用 distinct() return 你是一个列表。
Book.objects.exclude(series=None).distinct('series')
如果您需要排除空值和空字符串,首选方法是将条件链接在一起,如下所示:
Book.objects.exclude(series__isnull=True).exclude(series__exact='')
您可以关注此主题以更好地理解Filtering for empty or NULL names in a queryset
我有两个模型:
class BookSeries(models.Model):
title = models.CharField(max_length=200, null=False, blank=False, unique=True)
#extra fields
class Book(models.Model):
series = models.ForeignKey(BookSeries, blank=True, null=True, default=None)
publisher = models.ForeignKey(Publisher, default=None, null=True, blank=True)
title = models.CharField(max_length=200, null=False, blank=False, unique=True)
#extra fields
现在我想查询所有不属于一个系列的书,并且只查询属于同一个系列的任何一本书(系列可以为空)。
问题陈述:
我想查询所有单本和丛书。 由于一个系列可以有多本书,而一本书可能不属于一个系列。解决方案之一是查询所有书籍对象(不属于系列)并查询所有系列对象,如here所述。但这会在响应中将所有系列和书籍放在一起。我不想把它们组合在一起(我也在使用分页)。
类似于:Book.objects.filter( disctinct only if(series is not None))
我想过使用 distinct 和 exclude,但没用。
我建议采用以下方法:
获取不属于
series
的所有图书的id:ids_list1 = list(Book.objects.filter(series=None).values_list('id', flat=True))
获取属于
series
的所有书籍的 ID,并且仅首先使用distinct
:ids_list2 = list(Book.objects .exclude(series=None) # exclude ones which are not in a series .order_by('series') # order by series .distinct('series') # keep the first book in each series .values_list('id', flat=True))
现在,您可以合并这两个列表并再次查询 return 仅具有这些 ID 的图书:
ids = id_list1 + id_list2
books = Book.objects.filter(id__in=ids)
如果系列是 None,首先排除所有,然后调用 distinct() return 你是一个列表。
Book.objects.exclude(series=None).distinct('series')
如果您需要排除空值和空字符串,首选方法是将条件链接在一起,如下所示:
Book.objects.exclude(series__isnull=True).exclude(series__exact='')
您可以关注此主题以更好地理解Filtering for empty or NULL names in a queryset