如何使用ManyToOne类似字段创建模型?

时间:2016-04-13 13:22:48

标签: python django django-models

我正在试图弄清楚如何正确创建一个必须具有两个属性(模型)的模型,并且它应该满足某些条件。

因此模型称为Job

Job代表购买从一种语言(模型Language)到另一种语言(模型Language)的翻译。

每个Job必须包含1个language_from属性和1个language_to属性。

我的旧模特:

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

    def __str__(self):
        return self.name

class Job(models.Model):
    customer = models.ForeignKey(User, related_name='orders')
    translator = models.ForeignKey(User, related_name='jobs',null=True)
    price = models.FloatField(null=True,blank=True)

    language_from = # Didn't know what to put here
    language_to = # Didn't know what to put here   

    def __str__(self):
        return '{}: {}'.format(self.customer,)

我正在寻找一种如何使它工作的方法,我虽然关于一些ManyToOne字段,但我意识到没有这样的字段。所以我一直建议用这种方式重建我的模型:

  

Job中没有language_fromlanguage_to属性。   模型to中将有fromLanguage个属性   将是ForeignKey s。

因此Job不会有language_from/to个属性,而不是Language模型中的属性:

class Language(models.Model):
    shortcut = models.CharField(max_length=40)
    name = models.CharField(max_length=40)
    job_from = models.ForeignKey('Job',related_name='language_form',null=True)
    job_to = models.ForeignKey('Job',related_name='language_to',null=True)

    def __str__(self):
        return self.name

这种方式可能会正常工作,但有很多问题。

  1. 我无法告诉Django每个Job都必须完全正确 language_formlanguage_to
  2. 尝试创建JobCreationForm时出现问题,因为我无法在language_from/to
  3. 中添加class Meta:字段
  4. 我认为它不直观,还有更多我不知道的问题
  5. class JobCreationForm(forms.ModelForm):
        description = forms.CharField(widget=forms.Textarea(attrs={'placeholder': 'Specification'}))
        file = forms.FileField()
    
    
        class Meta:
            model = Job
            fields = (
                'language_from','language_to', 'description', 'file', 'specialist'
            )
    
      
        
          

    异常值:       为作业指定的未知字段(language_from,language_to)

        
      

    有人知道我该怎么办?

1 个答案:

答案 0 :(得分:0)

首先,您不能在字段中使用相关名称()。 所以改变

    fields = (
        'language_from','language_to', 'description', 'file', 'specialist'
    )

进入

    fields = (
        'job_from','job_to', 'description', 'file', 'specialist'
    )

接下来,如果你想为每份工作提供一种语言来自&语言,这些是必填字段,所以你可以这样做:

job_from = models.ForeignKey('Job',related_name='language_form')
job_to = models.ForeignKey('Job',related_name='language_to')

({{3}})