在 Django 中获取模型的反向关系项
Get backward relationships items for model in Django
我有一个关于汽车备件评论的宠物项目。
这里是models.py:
class CarBrand(models.Model):
brand = models.CharField(max_length=40, choices=(), unique=True, verbose_name="Марка")
def __str__(self):
return self.brand
def get_absolute_url(self):
return reverse_lazy('car_models_all', kwargs={'car_id': self.pk})
class CarModel(models.Model):
model_name = models.CharField(max_length=60, db_index=True, verbose_name="Модель")
brand_id = models.SmallIntegerField(verbose_name="ID марки")
def __str__(self):
return self.model_name
def get_absolute_url(self):
return reverse_lazy('model_info', kwargs={'model_id': self.pk})
class SparePartCategory(models.Model):
name = models.CharField(max_length=255, db_index=True, verbose_name='Название')
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse_lazy('spare_parts_category', kwargs={'category_id': self.pk})
class SparePart(models.Model):
name = models.CharField(max_length=255, db_index=True, verbose_name='Название')
brand = models.CharField(max_length=255, db_index=True, verbose_name="Производитель")
number = models.CharField(max_length=30, db_index=True, verbose_name="Номер (артикул)")
category = models.ForeignKey(SparePartCategory, on_delete=models.PROTECT, verbose_name="Категория")
def __str__(self):
return ' '.join([self.name, self.brand, self.number])
def get_absolute_url(self):
return reverse_lazy('get_spare_part', kwargs={'spare_part_id': self.pk})
class Review(models.Model):
RATING_VALUES = [
('1', 'Ужасно'), ('2', 'Плохо'), ('3', 'Сносно'), ('4', 'Хорошо'), ('5', 'Отлично'),
]
spare_part = models.ForeignKey(SparePart, on_delete=models.PROTECT, verbose_name="Запчасть")
mileage = models.SmallIntegerField(verbose_name="Пробег, тыс.км")
car_brand = models.ForeignKey(CarBrand, on_delete=models.PROTECT, verbose_name="Марка авто")
car_model = models.ForeignKey(CarModel, on_delete=models.PROTECT, verbose_name="Модель авто")
owner = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Владелец")
rating = models.CharField(max_length=1, choices=RATING_VALUES, verbose_name="Рейтинг", default=3)
review = models.TextField(max_length=1000, blank=True, verbose_name="Отзыв")
def __str__(self):
return ' '.join([self.spare_part.name, self.spare_part.brand, self.spare_part.number])
在 views.py 我得到一个 SparePart
def get_spare_part(request, spare_part_id):
spare_part = get_object_or_404(SparePart, pk=spare_part_id)
installed_on_cars = # here I need to get all CarModel for current SparePart with Review exists
context = {
'spare_part': spare_part,
'installed_on_cars': installed_on_cars,
}
return render(request, 'mileage/spare_part.html', context)
我需要获取当前 SparePart 的所有 CarBrand 和 CarModel,并且存在 Review,并获取它们的模板超链接。我怎样才能实现这个?
我想我需要用落后的关系来制作它,但无法理解如何。
使用 _set 管理器对象(文档 here)。
for review in spare_part.review_set.all():
print(f'brand: {review.care_brand}')
print(f'model: {review.car_model}')
如果您在 Review 中为 spare_parts 定义了一个 related_name(例如 'reviews),您可以使用该名称进行反向查询而不是 _set(例如 spare_part.reviews.all()
)。
我有一个关于汽车备件评论的宠物项目。
这里是models.py:
class CarBrand(models.Model):
brand = models.CharField(max_length=40, choices=(), unique=True, verbose_name="Марка")
def __str__(self):
return self.brand
def get_absolute_url(self):
return reverse_lazy('car_models_all', kwargs={'car_id': self.pk})
class CarModel(models.Model):
model_name = models.CharField(max_length=60, db_index=True, verbose_name="Модель")
brand_id = models.SmallIntegerField(verbose_name="ID марки")
def __str__(self):
return self.model_name
def get_absolute_url(self):
return reverse_lazy('model_info', kwargs={'model_id': self.pk})
class SparePartCategory(models.Model):
name = models.CharField(max_length=255, db_index=True, verbose_name='Название')
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse_lazy('spare_parts_category', kwargs={'category_id': self.pk})
class SparePart(models.Model):
name = models.CharField(max_length=255, db_index=True, verbose_name='Название')
brand = models.CharField(max_length=255, db_index=True, verbose_name="Производитель")
number = models.CharField(max_length=30, db_index=True, verbose_name="Номер (артикул)")
category = models.ForeignKey(SparePartCategory, on_delete=models.PROTECT, verbose_name="Категория")
def __str__(self):
return ' '.join([self.name, self.brand, self.number])
def get_absolute_url(self):
return reverse_lazy('get_spare_part', kwargs={'spare_part_id': self.pk})
class Review(models.Model):
RATING_VALUES = [
('1', 'Ужасно'), ('2', 'Плохо'), ('3', 'Сносно'), ('4', 'Хорошо'), ('5', 'Отлично'),
]
spare_part = models.ForeignKey(SparePart, on_delete=models.PROTECT, verbose_name="Запчасть")
mileage = models.SmallIntegerField(verbose_name="Пробег, тыс.км")
car_brand = models.ForeignKey(CarBrand, on_delete=models.PROTECT, verbose_name="Марка авто")
car_model = models.ForeignKey(CarModel, on_delete=models.PROTECT, verbose_name="Модель авто")
owner = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Владелец")
rating = models.CharField(max_length=1, choices=RATING_VALUES, verbose_name="Рейтинг", default=3)
review = models.TextField(max_length=1000, blank=True, verbose_name="Отзыв")
def __str__(self):
return ' '.join([self.spare_part.name, self.spare_part.brand, self.spare_part.number])
在 views.py 我得到一个 SparePart
def get_spare_part(request, spare_part_id):
spare_part = get_object_or_404(SparePart, pk=spare_part_id)
installed_on_cars = # here I need to get all CarModel for current SparePart with Review exists
context = {
'spare_part': spare_part,
'installed_on_cars': installed_on_cars,
}
return render(request, 'mileage/spare_part.html', context)
我需要获取当前 SparePart 的所有 CarBrand 和 CarModel,并且存在 Review,并获取它们的模板超链接。我怎样才能实现这个? 我想我需要用落后的关系来制作它,但无法理解如何。
使用 _set 管理器对象(文档 here)。
for review in spare_part.review_set.all():
print(f'brand: {review.care_brand}')
print(f'model: {review.car_model}')
如果您在 Review 中为 spare_parts 定义了一个 related_name(例如 'reviews),您可以使用该名称进行反向查询而不是 _set(例如 spare_part.reviews.all()
)。