Я использую две связанные модели в моем приложении Django. Объекты, созданные таким образом в моделях, отображаются с использованием класса listview. В дочерней модели я могу создать несколько строк на основе определенной контрольной даты. Когда я пытаюсь отобразить значения из обеих моделей (связанных с полем FK), отображаются все дочерние объекты для соответствующих полей FK (там, где имеется более одной записи).
Есть ли способ, которым Я могу использовать select distinct
для фильтрации дублирующихся строк. Я попытался:
myModel.objects.distinct().order_by('id')
, но все еще получаю все дочерние строки для родителя id
.
В моем шаблоне я использую:
{% for obj in object_list %}
{{ obj.<field1> }} <!-- field1: Parent model field -->
{% for item in obj.<child_model>_set.all %}
{{ item.<field2> }} <!-- field2: Child model field -->
{% endfor %}
{% endfor %}
My вопрос:
Как отфильтровать повторяющиеся строки перед отображением данных?
Бэкэнд sqlite3 для Django 2.0.6 / Python 3,6
Редактировать
Вот как генерируется текущий список:
Первый столбец pk родительской записи модели, а следующий столбец - для дочерних записей ' pk .
Что я пытается получить:
Вариант 1: Получить только последнюю (по дате) запись для комбинации родитель / ребенок по c числам (то есть для номера родительской записи 32 , должна отображаться только комбинация 32 | 156 , а также со значениями для дочерних записей 149 и 148 не должно отображаться).
ИЛИ * 10 59 *
Вариант 2: Получить всю комбинацию записей, сгруппированных по полю ParentModel pk и полю ChildModel pk, которые будут показаны отдельно в последовательных строках (как вы можете видеть, несколько значений для родительской записи (где бы она ни существовала) отображается в той же строке , последовательные столбцы ).
PS. Я сожалею, что дела здесь становятся довольно плотными.
Edit 2
Это представление класса, которое я использую для отображения данных:
class myRateListView(ListView):
template_name = "rate_list.html"
context_object_name = 'ratelists'
model = ParentModel
def get_context_data(self, **kwargs):
context = super(myRateListView, self).get_context_data(**kwargs)
context.update({
'rate_item_list': ChildModel.objects.order_by('field3'),
})
return context
def get_queryset(self):
return ParentModel.objects.values('field1', 'childmodel__field2').distinct()
Здесь я получаю ошибку :
Невозможно разрешить ключевое слово childmodel в поле. Варианты выбора ....
Я думаю, что мой классный вид неверен ??
Редактировать 3
Модели и детали просмотра:
модели .py
class TptRateDoc(models.Model):
tpt_rate_doc_number = models.IntegerField(null=True, blank=True.....)
loc_from = models.ForeignKey(Location, related_name='locn_from', on_delete=.......)
loc_to = models.ForeignKey(Location, related_name='locn_to', on_delete=.......)
create_date = models.DateField(default=timezone.now,...)
class TptRateItems(models.Model):
tpt_doc_header = models.ForeignKey(TptRateDoc, on_delete=...)
tpt_rate_item_num = models.CharField(max_length=3, default=10,...)
tpt_rate_valid_from_date = models.DateField(null=True, verbose_name='From date')
tpt_rate_valid_to_date = models.DateField(null=True, verbose_name='To date')
tpt_rate = models.DecimalField(max_digits=7, decimal_places=2, null=True, blank=True,...)
views.py
class TptRateListView(ListView):
template_name = "tpt_rate_list.html"
context_object_name = 'tptrates'
model = TptRateDoc
def get_context_data(self, **kwargs):
context = super(TptRateListView, self).get_context_data(**kwargs)
context.update({
'tpt_rate_item_list': TptRateItems.objects.order_by('tpt_rate_valid_to_date'), # .distinct()
})
return context
def get_queryset(self):
# return TptRateDoc.objects.order_by('loc_from')
return TptRateDoc.objects.values('tpt_rate_doc_number', 'tptrateitems__tpt_rate_item_num').distinct()
Примечание: Закомментированные части - это то, что я пробовал ранее.