#django #django-models #django-signals
#django #django-модели #django-сигналы
Вопрос:
Я установил связь OtoO между Property и моделью ListingDetail:
class Property(models.Model):
.
.
.
def __str__(self):
return "Property " str(self.pk)
Модель ListingDetail:
class ListingDetial(models.Model):
property = models.OneToOneField("properties.Property", on_delete=models.CASCADE)
.
.
.
Теперь я не хочу вручную выбирать поле свойства в LocationDetail Model и вместо этого хочу сохранить его автоматически.
В настоящее время я использовал сигнал post_save для достижения функциональности:
@receiver(post_save, sender=Property)
def ensure_sub_section_model_exists(sender, **kwargs):
if kwargs.get('created', False):
ListingDetial.objects.get_or_create(property=kwargs.get('instance'))
Но проблема с этим подходом заключается в том, что каждый раз, когда создается экземпляр свойства, он создает ListingDetail , единственная проблема с этим подходом заключается в том, что мне нужно сохранять все поля обнуляемыми.
Я хочу, чтобы после создания ListingModel свойство сохраняло значение, такое же, как PK для ListingModel .
Ответ №1:
Если вы сначала создаете Property
, а затем добавляете ListingDetail
к нему, было бы лучше иметь это OneToOneField в вашей Property
модели. И для этого нет необходимости в сигналах.
class Property(models.Model):
listing_detail = models.OneToOneField("properties.ListingDetail", on_delete=models.CASCADE)
def save(self, *args, **kwargs):
if not self.pk:
self.listing_detail = ListingDetail.objects.create()
super().save(*args, **kwargs)
Комментарии:
1. Это поле обязательно., это то, что написано в Django admin
2. Кроме того, разве это ничем не отличается от приведенного выше кода, где создаются экземпляры других моделей, но поле все равно должно оставаться пустым или пустым, чтобы успешно создать модель.
3. Вы можете установить для required значение false в этом поле. И с помощью вашего метода сохранения вы уверены, что для каждого свойства будет создан listing_detail