Поле "Один ко многим" в модели Django
Я создаю модель в Django, но совсем запутался в том, какой тип поля я должен взять:
Проблема: Мне нужно получить доступ к нескольким доменам в одной веб-классификации, посоветуйте мне, пожалуйста, как мне сделать эти поля взаимосвязанными, чтобы если я пытаюсь получить детали одной веб-классификации, то она также будет содержать список связанных доменов в ней также.
Model.py:
class WebClassification(models.Model):
vendor_id = models.ForeignKey(Vendor, on_delete=models.CASCADE, default=None, null=True)
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=100)
description = models.CharField(max_length=1000)
domain_name = models.[what type i take here]
def __str__(self):
return self.name
Domain.py
class Domain(models.Model):
id = models.IntegerField()
domain_name = models.CharField(max_length=200)
def __str__(self):
return self.domain_name
Вы можете сделать это двумя способами. Это зависит от того, может ли один Domain
иметь несколько WebClassification
или только один:
# one Domain may have multiple WebClassifications
class WebClassification(models.Model):
...
domains = models.ManyToManyField("Domain")
# or
# one Domain may have one WebClassification
class Domain(models.Model):
...
web_classification = ForeignKey("WebClassification", on_delete=models.CASCADE, default=None, null=True, related_name="domains")
с помощью обоих методов вы можете получить доступ ко всем доменам, связанным для одного WebClassification
с:
web_classification = WebClassification.objects.create(...)
web_classification.domains.all()
и в шаблоне
{{ web_classification.domains.all }}
Если каждая веб-классификация должна включать список связанных доменов, то в модель ForeignKey
необходимо включить поле Domain
для WebClassification
:
# models.py
class Domain(models.Model):
id = models.IntegerField()
web_classification = models.ForeignKey(WebClassification, on_delete=models.CASCADE)
domain_name = models.CharField(max_length=200)
def __str__(self):
return self.domain_name
И вы бы создали сериализатор для WebClassification
модели:
# serializers.py
from rest_framework import serializers
from .models import Domain, WebClassification
class WebClassificationSerializer(serializers.ModelSerializer):
domains = serializers.SerializerMethodField('get_domains')
def get_domains(self, id):
return Domain.objects.filter(web_classification=id).values()
class Meta:
model = WebClassification
fields = "__all__"
Используйте WebClassificationSerializer
в представлении:
# views.py
from rest_framework import generics
from .serializers import WebClassificationSerializer
from .models import WebClassification
class WebClassificationListAPIView(generics.ListAPIView):
serializer_class = WebClassificationSerializer
queryset = WebClassification.objects.all()