Как автозаполнить поле в 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)
Вернуться на верх