Доступ к атрибуту модели через общий внешний ключ в другой модели
Я полный новичок в мире Django и я запутался в том, как я могу получить доступ к списку значений из таблицы, которая имеет доступ к другой таблице через внешний ключ.
Вот модель запроса:
class Request(models.Model):
"""
Carry requests
"""
sender = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="requests")
offers = models.ManyToManyField("Offer", blank=True)
code = models.UUIDField(max_length=64, default=uuid.uuid4, editable=False)
weight = MeasurementField(
measurement=Weight, validators=[MinValueValidator(Weight(g=1))], verbose_name=gettext_lazy("Weight")
)
description = models.TextField(blank=False)
origin_country = models.ForeignKey(
Country, on_delete=models.PROTECT, related_name="origin_requests", verbose_name=gettext_lazy("Origin Country")
)
origin_city = models.ForeignKey(
City, on_delete=models.PROTECT, related_name="origin_requests", verbose_name=gettext_lazy("Origin City")
)
destination_country = models.ForeignKey(
Country,
on_delete=models.PROTECT,
related_name="destination_requests",
verbose_name=gettext_lazy("Destination Country"),
)
destination_city = models.ForeignKey(
City,
on_delete=models.PROTECT,
related_name="destination_requests",
verbose_name=gettext_lazy("Destination City"),
)
status = models.CharField(max_length=40, choices=Status.choices, default=Status.AVAILABLE)
reward = MoneyField(
max_digits=1000,
decimal_places=2,
default_currency="PHP",
validators=[MinMoneyValidator(defaultdict(lambda: 0.01))],
verbose_name=gettext_lazy("My Initial Offer Fee"),
)
photo = models.ImageField(upload_to="requests/", verbose_name=gettext_lazy("Photo of Item"))
accepted_offer = models.ForeignKey(
"Offer", on_delete=models.SET_NULL, blank=True, null=True, related_name="accepted_requests"
)
add_insurance = models.BooleanField(default=False, verbose_name=gettext_lazy("I WANT 100% INSURANCE FOR MY ITEMS"))
declared_amount = MoneyField(
max_digits=1000,
decimal_places=2,
default_currency="PHP",
validators=[MinMoneyValidator(defaultdict(lambda: 0.01))],
verbose_name=gettext_lazy("Declared Amount"),
blank=True,
null=True,
)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
history = HistoricalRecords(excluded_fields=["sender", "code", "created", "modified"])
@property
def short_code(self) -> str:
return str(self.code)[:8]
def __str__(self) -> str:
return f"({str(self.code)[:8]}) @{self.sender.username}: {self.origin_country} -> {self.destination_country}"
Вот модель переговоров:
class Negotiation(models.Model):
request = models.ForeignKey("Request", on_delete=models.CASCADE, related_name="negotiations")
offer = models.ForeignKey("Offer", on_delete=models.CASCADE, related_name="negotiations")
price = MoneyField(
max_digits=1000,
decimal_places=2,
default_currency="PHP",
validators=[MinMoneyValidator(defaultdict(lambda: 0.01))],
verbose_name=gettext_lazy("Offered Price"),
default=Money(amount=0.00, currency="USD"),
)
status = models.CharField(max_length=40, choices=NegotiationStatus.choices, default=NegotiationStatus.NEGOTIATING)
reported_by = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET_NULL,
blank=True,
null=True,
related_name="reported_negotiations",
)
report_description = models.TextField(blank=True, null=True)
created = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = [["request", "offer"]]
def __str__(self) -> str:
return f"Negotiation: {str(self.request)} <-> {str(self.offer)}"
views.py:
class NegotiationsView(TemplateView):
template_name = "expadite/negotiations.html"
extra_context = {"page": "negotiations"}
def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> TemplateResponse:
if kwargs.get("tab") not in (None, "travellers", "senders"):
return redirect(to=reverse("expadite:negotiations/tab", kwargs={"tab": "travellers"}))
return super(NegotiationsView, self).get(request, *args, **kwargs)
def get_context_data(self, **kwargs: Any) -> Dict:
context = super(NegotiationsView, self).get_context_data(**kwargs)
context.update({"tab": kwargs.get("tab", "travellers")})
return context
В принципе, если я хочу, скажем, получить origin_country запросов, которые находятся в процессе переговоров, как мне это сделать?
Где-то в своем get()
вы захотите найти все переговоры. Из документов:
negotiations = Negotiation.objects.all()
По желанию вы можете отфильтровать их:
negotiations = Negotiation.objects.filter(status=...)
Затем вы хотите итерировать каждое согласование и использовать .
для доступа к запросу и снова для доступа к происхождению
for negotiation in negotiations:
print(negotiation.request.origin_country)