Как сохранить поле из другой модели в переменную NOT A FIELD
У меня есть модель под названием Actual:
# Actual parts table
class Actual(models.Model):
vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE, verbose_name="Vendor name", related_name="actualvendor")
number = models.CharField("External part number", max_length=32, unique=True, blank=True, null=True)
description = models.CharField(max_length=64, blank=True)
pq = models.DecimalField(max_digits=7, decimal_places=2, default=1)
mrrp = models.DecimalField(max_digits=10, decimal_places=2)
# Model metadata
class Meta:
unique_together = ["vendor", "number"]
verbose_name_plural = "actual external parts"
# Display below in admin
def __str__(self):
return f"{self.number}"
У меня также есть другая модель под названием Offer:
class Offer(models.Model):
sync_id = models.ForeignKey(Sync, on_delete=models.CASCADE, verbose_name="Internal part number", related_name="part")
discount = models.DecimalField(max_digits=3, decimal_places=2, default=0)
moq = models.DecimalField(max_digits=4, decimal_places=2, default=1)
status = models.CharField(max_length=20, choices=OFFERSTATUS_CHOICES, default=1)
actual = models.OneToOneField(Actual, on_delete=models.CASCADE)
# Display something in admin
def __str__(self):
return f"Offer {self.id} for {self.sync_id}"
# Calculate the price
def price(self):
return self.actual.mrrp * (1-self.discount)
Я пытаюсь рассчитать "цену", используя 'mrp' Но 'mrrp' из другой модели.
Я могу сделать это с помощью кода, который я прикрепил, но как вы можете видеть в админке django, 'actual' отображается как поле.
Во-первых, мне не нужно, чтобы это было поле. Мне нужно, чтобы 'Actual' была только переменной, которая хранит значение 'mrrp'.
Во-вторых, я хочу, чтобы он автоматически выбирал соответствующее значение на основе выбора других полей.
Как вы можете видеть, в настоящее время я использую поле и, в частности, поле OnetoOne для этого.
Есть ли другой способ ссылаться на поля из другой модели? Уверен, что поля - это не единственный способ?
Я решил эту проблему с помощью декоратора свойств. У меня была правильная идея, но я не поместил декоратор свойств поверх функции, которая вычисляет цену. Используйте декоратор свойств для отображения данных, как вы бы сделали поле в Django.
Я добавил следующее в нижнюю часть моей модели:
@property
def price(self):
return self.actual.mrrp * (1-self.discount)