I'm not sure this will work but you could try creating a VIEW on the
database side that does the union there and access it through an un-managed
model.
CREATE VIEW *view_name* AS SELECT id, name FROM *a* UNION SELECT id, name
FROM *b*;
class C(models.Model):
name = models.CharField()
class Meta:
db_table = '*view_name*'
managed = False
Le jeudi 17 avril 2014 02:51:34 UTC-4, Shoaib Ijaz a écrit :
>
> I don't want use SQL query in django
>
> On Thursday, 17 April 2014 04:39:09 UTC+5, Russell Keith-Magee wrote:
>>
>> On Wed, Apr 16, 2014 at 9:30 PM, Shoaib Ijaz <[email protected]>
>> wrote:
>> > Sorry for duplicate post How to create Union
>> >
>> > I am using Django REST Framework in project and I want to create union
>> two
>> > different Models.
>> >
>> > My Models
>> >
>> > 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'
>> >
>> > I am trying to create this query
>> >
>> > SELECT id,name FROM tbl_a UNION (SELECT b.id,b.name From tbl_b b)
>> >
>> > My attempt for union
>> >
>> > 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.
>> >
>> > Now i tried with parent Model in this way
>> >
>> > class ABWrapper(models.Model):
>> > objects = models.GeoManager()
>> > class Meta:
>> > db_table = u'ab_wrapper'
>> >
>> > Added this model as ForeignKey above both Models
>> >
>> > 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.
>> >
>> > Another attempt by making 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.
>> >
>> > I have searched on it, mostly answered this issue as using list for
>> both
>> > models. But I don't want to use list as I am using Django Rest
>> Framework so
>> > I need QuerySet. So my question if I use list for union can I convert
>> > resulting list into QuerySet.
>> >
>> > Note: I don't want to use SQL Query in Django
>>
>> Why not? That would seem to be the exact answer you need.
>>
>> You appear to have a very specific idea of the SQL query you want to
>> issue, including UNION clauses (an operator that Django's ORM doesn't
>> support) and "extra" columns (which means the data you want is outside
>> your regular Django model). Getting this query in 100% native Django
>> query sets is going to be somewhere between difficult and impossible.
>>
>> However, you don't have to drop right back to SQL cursors - Django has
>> raw query sets for exactly this purpose:
>>
>> ABWrapper.objects.raw("SELECT …. FROM … WHERE")
>>
>> This will return ABWrapper objects contained in a query set object
>> that should be compatible with Django REST Framework, but you get
>> those objects by providing the exact SQL you want to execute.
>>
>> See:
>>
>> https://docs.djangoproject.com/en/dev/topics/db/sql/
>>
>> for more details
>>
>> Yours,
>> Russ Magee %-)
>>
>
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/23604307-43be-45ce-837f-1656ada1863c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.