I have two models Property and Tenants.
Each Property can have multiple allowed_tenants.
Models
I want a query where it fetches all properties along with their allowed_tenants in a single query(possibly less number of queries) using django orm
class Tenants(models.Model):
tenant_type = models.CharField(verbose_name='tenant type', max_length=32)
def __str__(self):
return self.tenant_type
class Property(models.Model):
owner = models.ForeignKey('user.User', on_delete=models.CASCADE, related_name='properties')
property_name = models.CharField(verbose_name='property name', max_length=64)
category = models.CharField(verbose_name='category', choices=Choices.category_choices, max_length=16)
bathrooms = models.IntegerField(verbose_name='bathrooms', default=1)
region = models.ForeignKey(Area, unique=True, related_name='properties', on_delete=models.CASCADE)
# area = models.CharField(verbose_name='area', max_length=128)
landmark = models.CharField(verbose_name='landmark', max_length=32)
expected_rent = models.CharField(verbose_name='expected rent', default='not disclosed', max_length=16)
expected_deposit = models.CharField(verbose_name='expected deposit', default='not disclosed', max_length=16)
available_from = models.DateField(verbose_name='available from', default=datetime.date.today)
allowed_tenants = models.ManyToManyField(Tenants, related_name='properties')
likes = models.IntegerField(verbose_name='like', default=0)
last_updated = models.DateField(verbose_name='last updated', auto_now_add=True)
The result i am expecting should be like =>
[{...property_details, tenants: ['family', 'bachelor'], property_name: 'property1'}, {...}]
i tried something like this, but its giving me multiple records for a single property with different tenants in each property
properties = Property.objects.filter(allowed_tenants__tenant_type__in=['family']).annotate(
property_owner=F('owner__first_name'),
city=F('region__city__city'),
area=F('region__area_name'),
tenants=F('allowed_tenants__tenant_type'),
).values(
'property_owner', 'property_name', 'category', 'bathrooms', 'city', 'area', 'landmark',
'expected_rent', 'expected_deposit', 'available_from', 'tenants', 'likes', 'last_updated'
)
[{...property1, tenants: 'family', property_name:'property_1'}, {...property1, tenants: 'bachelor', property_name:'property_1'}, {...}]