Я пытаюсь понять, как Django возвращает столбцы из внешних ключей, особенно из-за ситуации с m2m, легко в SQL, но я пытаюсь войти в Django.
В этом примере у меня есть 3 модели, Sample
, который имеет m2m с Container
и Location
, который имеет 1-ко-многим с Container
.
Сценарий 1a: Из таблицы Sample получите контейнеры, которыеобразец находится в (возвращаются sample_number и container_name).
Сценарий 1b: Из контейнера получают связанные образцы (возвращают container_number и sample_number).
Сценарий 2a: Из модели местоположения получают контейнеры (location_name и container_names).
Сценарий 2b: Из модели Контейнера получите местоположение (Container_name и location_name).
Надеемся, что это послужит хорошим общим справочным материалом для других.
# models.py
class Location(models.Model):
location_id = models.AutoField(primary_key=True)
location_name = models.CharField(max_length=100, blank=True, null=True)
class Sample(models.Model):
sample_id = models.AutoField(primary_key=True)
sample_number = models.IntegerField()
class Container(models.Model): #like a friend
container_id = models.AutoField(primary_key=True)
container_name = models.CharField(max_length=50, blank=True, null=True)
location_id = models.ForeignKey(Location, db_column='location_id', on_delete = models.PROTECT, related_name = 'location')
samples = models.ManyToManyField('Sample', through='ContainerSamples', related_name='containers')
# views.py - Implements a filter
def detailcontainer(request, container_id):
container = get_object_or_404(Container, pk=container_id)
samples = container.samples.all()
container_contents = container.samples.all()
unassigned_samples = Sample.objects.all()
qs = Sample.objects.all()
context = {
'queryset': qs,
'container':container,
'container_contents': container_contents,
'unassigned_samples': unassigned_samples,
}
return render(request, 'container/detailcontainer.html', context)
# templates
{% for unassigned in unassigned_samples %}
# 1a [solved]
{% for unassigned in unassigned_samples %}
{{ unassigned.sample_number }}
{% for container in unassigned.containers.all %}
{{ container.location_id }}.{{ container.container_name }}
{% endfor %}
{% endfor %}
# 1b
{{ unassigned.____________ }} # the container_name
{{ unassigned.____________ }} # the related samples (sample_number)
# 2a
{{ unassigned.____________ }} # the location_name
{{ unassigned.____________ }} # the related container names (container_name)
# 2b
{{ unassigned.____________ }} # the container_name
{{ unassigned.____________ }} # the location_name
{% endfor %}