queryset - select where django
Cómo crear Union en Django queryset (1)
Puede usar objetos Q en django para el filtrado complejo. Consulte this_link para detalles de implementación.
Estoy usando Django REST Framework en el proyecto y quiero crear una unión de dos modelos diferentes.
Mis modelos
class A(models.Model):
name = models.CharField(max_length=240, blank=True)
geometry = models.GeometryField(blank=True, null=True)
abwrapper= models.ForeignKey(ABWrapper)
class Meta:
db_table = ''tbl_a''
class B(models.Model):
name = models.CharField(max_length=240, blank=True)
link = models.IntegerField(blank=True, null=True)
geometry = models.GeometryField(blank=True, null=True)
abwrapper= models.ForeignKey(ABWrapper)
class Meta:
db_table = ''tbl_b''
Estoy tratando de crear esta consulta
SELECT id,name FROM tbl_a UNION (SELECT b.id,b.name From tbl_b b)
Mi intento de unión
a = A.objects.values_list(''id'')
b = B.objects.values_list(''id'')
queryset = a | b
Error:
AssertionError: Cannot combine queries on two different base models.
Ahora probé con Parent Model de esta manera
class ABWrapper(models.Model):
objects = models.GeoManager()
class Meta:
db_table = u''ab_wrapper''
Se agregó este modelo como ForeignKey sobre ambos Modelos
a = ABWrapper.objects.filter(a__isnull=False).values(''a__id'')
b = ABWrapper.objects.filter(b__isnull=False).values(''b__id'')
queryset = a | b
Error:
TypeError: Merging ''GeoValuesQuerySet'' classes must involve the same values in each case.
Otro intento al hacer alias
a = ABWrapper.objects.filter(a__isnull=False).extra(select={''tempID'':''a__id''}).values_list(''tempID'')
b = ABWrapper.objects.filter(b__isnull=False).extra(select={''tempID'':''b__id''}).values_list(''tempID'')
queryset = a | b
Error:
ValueError: When merging querysets using ''or'', you cannot have extra(select=...) on both sides.
He buscado en él, la mayoría respondió este problema como el uso de la lista para ambos modelos. Pero no quiero usar la lista ya que estoy usando Django Rest Framework, así que necesito QuerySet. Entonces mi pregunta si uso list for union puedo convertir la lista resultante en QuerySet.
Nota: no quiero usar SQL Query en Django
¿Hay alguna otra manera de hacer esta tarea?