Поле "Один ко многим" в модели 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()
Вернуться на верх