3

ich ein Modell haben zu machen, in dem ich verschiedene Jobs für eine Arbeits Anwendung darstellen müssen, zum Beispiel:Wie meine Modelle folgen DRY Prinzipien

from django.db import models 

class PostFirstJobAd(models.Model): 
    fist_job_ad_title = models.CharField(max_length=225) 
    first_job_ad_description = models.TextField() 
    created_at = models.DateTimeField(auto_now=True) 

class PostSecondJobAd(models.Model): 
    second_job_ad_title = models.CharField(max_length=225) 
    second_job_ad_description = models.TextField() 
    created_at = models.DateTimeField(auto_now=True) 

class PostThirdJobAd(models.Model): 
    third_job_ad_title = models.CharField(max_length=225) 
    third_job_ad_description = models.TextField() 
    created_at = models.DateTimeField(auto_now=True) 

sofort können Sie sehen, dass ich title bin wiederholen, description und created_at, ändere ich nur Feldnamen, es ist nicht DRY und Code beginnt Geruch. Der Grund dafür ist, dass ich jeden Job separat in django admin registrieren möchte, damit ich eine klare Situation innerhalb der Website-Verwaltung habe.

Ein Weg, um sie trocken zu machen, ist Abstract base classes zu verwenden, aber ich habe ein Problem, weil aus der Dokumentation:

Dieses Modell wird dann keine Datenbanktabelle erstellen verwendet werden. Wenn es als Basisklasse für andere Modelle verwendet wird, werden stattdessen die Felder denen der untergeordneten Klasse hinzugefügt.

Was ist der richtige Ansatz in diesem Fall, kann mir jemand helfen, dies zu verstehen.

Antwort

2

Mit abstrakten Basismodelle:

class JobAd(models.Model): 
    title = models.CharField(max_length=225) 
    description = models.TextField() 
    created_at = models.DateTimeField(auto_now=True) 

    class Meta: 
     abstract = True 

class PostFirstJobAd(JobAd): 
    pass 

class PostSecondJobAd(JobAd): 
    pass 

class PostThirdJobAd(JobAd): 
    pass 

Dies würde 3 Tabellen erstellen. Die Basisklasse JobAd hat keine Tabelle in der Datenbank.

Da Sie scheinen, 3 verschiedene Modelle mit dem exakt gleichen Code zu haben, sollten Sie sich fragen, ob Sie wirklich 3 verschiedene Modelle überhaupt brauchen. Eine andere Möglichkeit besteht darin, sie alle in einer Tabelle zu speichern und ein weiteres Feld für die "andere" Sache hinzuzufügen.

class JobAd(models.Model): 
    pos = models.CharField(max_length=100, choices=['first', 'second', 'third']) 
    title = models.CharField(max_length=225) 
    description = models.TextField() 
    created_at = models.DateTimeField(auto_now=True) 

Ein Ganzzahl-Feld für pos ist ebenfalls möglich.

+0

Ich habe gefragt, dass ich sechs verschiedene Jobs darstellen muss, und der Grund, warum ich sie getrennt haben möchte, ist, weil ich eine klare Situation in Admin haben möchte, möchte ich nicht, dass meine Bewerber in einem Modell bewerben, Also für jeden Job eine Anwendung, ich hoffe, Sie verstehen mich – PetarP

+0

Überdenken Sie Ihr Design. Sie brauchen wirklich keine separaten Modelle. –

1

Zunächst einmal die abstrakten Modelle könnte sein, was Sie hier brauchen. Abhängig von den geschäftlichen Anforderungen müssen Sie möglicherweise etwas mehr an die Architektur denken.

Wenn in der Tat, Sie müssen Klassen abstrakte Basis verwenden:

class BaseJob(models.Model): 
    title = models.CharField(max_length=255) 
    # etc... 

    class Meta: 
     abstract = True 

    def method_1(self): 
     # base methods that work for instance data 

Sobald das definiert ist, können Sie die Basisklasse in einem konkreten Modell umsetzen können. Ein konkretes Modell ist ein Modell, das nicht die abstract = True metaclass Eigenschaft nicht verwendet (oder Proxy, etc.) wie folgt:

class Job(BaseJob): 
    pass 

Wenn Sie zusätzliche Felder benötigen, können Sie sie wie jedes andere Modellfeld definieren, aber wenn Sie laufen makemigrations Sie werden feststellen, dass die Felder bei der Migration hinzugefügt werden.

Verwandte Themen