2016-04-08 8 views
0

Djangoでスルーモデルを定義しようとすると問題が発生します。私は数時間前に質問を投稿しました。答えはスルークラスを定義することでした。しかし、問題は、このスルーモデルはすでに定義されたモデルを呼び出し、このスルーモデルの前に定義されているこれらのモデルの1つがこのスルーモデルを呼び出すことです。Djangoでスルーモデルを正しく定義する方法

NameError: name 'TranslatorLanguage' is not defined 

私はそれらを切り替える場合:

NameError: name 'UserProfile' is not defined 

THIS IS THE ANSWER(実際にはそれがTranslatorProfileしかしUserProfileではありません)

をあなたが何をすべきか知っていますか?

それが助け場合、私はmodels.pyを装着しています:

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'),) 

答えて

1

外部キーを参照するには、モデルクラスの代わりにmodelの文字列を使用する必要があります。定義の順序に問題がある場合は、特に当てはまります。 django doc foreign key sectionから引用:

あなたはまだ が定義されていないモデル上の関係を作成する必要がある場合、あなたはむしろモデル オブジェクト自体よりも、モデルの名前を使用することができます。

from django.db import models 

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

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

あなたはそれがmodels.pyの後半で定義されているので、このように、文字列としてTranslatorLanguageモデルを指定する必要があります:

languages = models.ManyToManyField(Language, through='TranslatorLanguage') 
関連する問題