2016-04-08 7 views
0

Ich stehe vor einem Problem, wenn ich versuche, ein Modell in Django zu definieren. Ich habe vor ein paar Stunden eine Frage gestellt und die Antwort war, eine durchgehende Klasse zu definieren. Das Problem ist jedoch, dass dieses Durchgangsmodell bereits definierte Modelle und eines dieser Modelle aufruft, die definiert werden, bevor dieses Durchgangsmodell dieses Durchgangsmodell aufruft.Wie definiere ich das Modell in Django richtig?

NameError: name 'TranslatorLanguage' is not defined 

Wenn ich schalte sie:

NameError: name 'UserProfile' is not defined 

THIS IS THE ANSWER (In der Tat, es ist kein TranslatorProfile aber UserProfile)

Sie wissen, was zu tun?

ich models.py im Falle bin Anbringen es hilft:

from __future__ import unicode_literals 
# from django.contrib.auth.base_user import AbstractBaseUser 
from django.contrib.auth.models import User 
from django.db import models 

class AdminContact(models.Model): 
    email = models.EmailField() 
    telephone = models.CharField(max_length=40) 

    def __unicode__(self): 
     return self.email 

class Language(models.Model): 
    shortcut = models.CharField(max_length=40) 
    name = models.CharField(max_length=40) 

    def __str__(self): 
     return self.name 



class Level(models.Model): 
    LEVEL_CHOICES = (
     ('standard','Standard level'), 
     ('professional','Professional level'), 
     ('native','Native speaker level'), 
    ) 
    name = models.CharField(max_length=40,choices=LEVEL_CHOICES, blank=False, null=False) 
    price_multiplier = models.FloatField() 



class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='userprofile') 
    date_of_birth = models.DateField(null=True,blank=True) 
    telephone = models.CharField(max_length=40,null=True,blank=True) 
    IBAN = models.CharField(max_length=40,null=True,blank=True) 
    created = models.DateTimeField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now=True) 


    MARITAL_STATUS_CHOICES = (
     ('single', 'Single'), 
     ('married', 'Married'), 
     ('separated', 'Separated'), 
     ('divorced', 'Divorced'), 
     ('widowed', 'Widowed'), 
    ) 
    marital_status = models.CharField(max_length=40, choices=MARITAL_STATUS_CHOICES, null=True, blank=True) 

    HOW_DO_YOU_KNOW_ABOUT_US_CHOICES = (
     ('coincidence', u'It was coincidence'), 
     ('relative_or_friends', 'From my relatives or friends'), 
    ) 
    how_do_you_know_about_us = models.CharField(max_length=40, choices=HOW_DO_YOU_KNOW_ABOUT_US_CHOICES, null=True, 
               blank=True) 

    # TRANSLATOR ATTRIBUTES 

    is_translator = models.BooleanField(default=False) 

    language_tuples = models.ManyToManyField(LanguageTuple,blank=True) 
    languages = models.ManyToManyField(Language, through='TranslatorLanguage') 

    rating = models.IntegerField(default=0) 

    number_of_ratings = models.BigIntegerField(default=0) 

    def __unicode__(self): 
     return '{} {}'.format(self.user.first_name, self.user.last_name) 

    def __str__(self): 
     return '{} {}'.format(self.user.first_name, self.user.last_name) 

class UserProfileLanguage(models.Model): 
    userprofile = models.ForeignKey(UserProfile) 
    language = models.ForeignKey(Language) 
    level = models.ForeignKey(Level) 

    class Meta: 
     unique_together = (('UserProfile', 'language'),) 

Antwort

1

Sie sollten die Zeichenfolge des Modells statt der Modellklasse selbst verwenden, um auf den Fremdschlüssel zu verweisen. Es ist besonders wahr, wenn Sie Probleme mit der Definitionssequenz haben. Zitiert aus django doc foreign key section:

Wenn Sie eine Beziehung auf ein Modell erstellen, die noch nicht gewesen definiert hat, können Sie den Namen des Modells verwenden können, anstatt das Modell Objekt selbst:

from django.db import models 

class Car(models.Model): 
    manufacturer = models.ForeignKey(
     'Manufacturer', 
     on_delete=models.CASCADE, 
    ) 
    # ... 

class Manufacturer(models.Model): 
    # ... 
    pass 
0

Sie finden das TranslatorLanguage Modell als String angeben müssen, da sie später in models.py definiert ist, wie folgt aus:

languages = models.ManyToManyField(Language, through='TranslatorLanguage') 
Verwandte Themen