Как автозаполнить поле в models.py
У меня есть класс Property с полем property_type, я хочу автозаполнять это поле, когда я создаю одну из других моделей, которые имеют отношения onetoone с Property. Я хочу, чтобы при создании квартиры в django admin для exp, property_type в Property автозаполнялось "Apartment", а при создании виллы в django admin автозаполнялось "villa"
class Property(models.Model):
created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="agent_of_property")
district_id = models.ForeignKey(District, on_delete=models.CASCADE)
slug = models.SlugField(max_length=255, unique=True)
property_type = models.CharField(choices=PROPERTY_TYPE, max_length=20)
title = models.TextField(verbose_name="Titulli", help_text="Vendos titullin e njoftimit", max_length=500)
description = models.TextField(verbose_name="Pershkrimi", help_text="Vendos pershkrimin",max_length=1000)
address_line = models.CharField(verbose_name="Adresa", help_text="E nevojeshme",max_length=255)
price = models.IntegerField()
area = models.IntegerField()
views = models.IntegerField(default=0)
documents = models.CharField(verbose_name="Dokumentacioni", help_text="Dokumentat", max_length=255)
status = models.BooleanField(default=True)
activity = models.CharField(max_length=20, choices=ACTION_OPTION)
is_active = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True, editable=False)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
verbose_name = "Prona"
verbose_name_plural = "Pronat"
def get_absolute_url(self):
return reverse("pronat:property_detail", args=[self.slug])
def __str__(self):
return self.title
class Apartment(Property):
property_id = models.OneToOneField(Property, on_delete=models.CASCADE, parent_link=True, primary_key=True)
floor = models.IntegerField(default=0)
room_num = models.IntegerField(default=0)
bath_num = models.IntegerField(default=0)
balcony_num = models.IntegerField(default=0)
class Meta:
verbose_name = "Apartament"
verbose_name_plural = "Apartamentet"
def save(self, *args, **kwargs):
self.property_type = "Apartment"
class Villa(Property):
property_id = models.OneToOneField(Property, on_delete=models.CASCADE, parent_link=True, primary_key=True)
living_room = models.IntegerField(default=1)
floors = models.IntegerField(default=1)
room_num = models.IntegerField(default=1)
bath_num = models.IntegerField(default=1)
balcony_num = models.IntegerField(default=0)
class Meta:
verbose_name = "Vila"
verbose_name_plural = "Vilat"```
Я не понимаю, что вы делаете. Если вы наследуете от моделей Property в Apartment, просто удалите OneToOneField и ваш метод сохранения будет
def save(self, *args, **kwargs):
self.property_type = 'Apartment'
super().save(*args, **kwargs)
Но если вы действительно хотите использовать OneToOneField, замените Property inherit на models.Model и ваш метод сохранения должен выглядеть следующим образом.
def save(self, *args, **kwargs):
self.property_id.property_type = 'Apartment'
self.property_id.save()
super().save(*args, **kwargs)
Для второго случая вы также можете использовать django signal
from django.db.models.signal import post_save
# ...
def populate_property_type(sender, created, instance, **kwargs):
if sender.__name__ == 'Apartment':
instance.property_id.property_type = 'Apartment'
instance.property_id.save()
# condition for Villa
post_save.connect(populate_property_type, sender=Apartment)
post_save.connect(populate_property_type, sender=Villa)
Я бы предложил добавить поле в таблицу Appartment с именем appartment_type и удалить property_type из Property. Но если вы не хотите этого делать, то для вашего случая возможны два варианта.
1.Когда вы добавляете значения из Django admin, вы также должны добавить property_type из Admin.В этом случае вам не нужно переопределять метод save. Зарегистрируйте таблицу Property и Appartment в одном представлении. Сделайте в админке таблицы Property и Appartment для представления admin. Затем зарегистрируйте их следующим образом, т.е.
admin.site.register(PropertyAdmin, AppartmentAdmin)
и добавьте значения в обе таблицы.
2: Просто переопределите метод сохранения и добавьте это
def save(self, *args, **kwargs):
self.property_id.property_type = 'Apartment' # you should add other field in Appartment table just avoid hard coded 'Apartment'
self.property_id.save()
super().save(*args, **kwargs)