2011-11-19 56 views
1

如何在模型中引入一个字段,该模型只会标记集合中的单个项目?理想的方法是有一个单选按钮,但radio_fields必须指向一个ForeignKey或选项,而我正在寻找的只是一个布尔字段。例如:Django - 在模型集中标记单个对象

class A(models.Model): 
    # fields 

class B(models.Model): 
    a  = models.ForeignKey(A) 
    primary = models.BooleanField(default=False) 

,如果我能限制primary这工作是True对于只有一个相关A的对象项目。

如果上面没有任何意义:我想只有一个项目是从一组共享相同AB项目True

UPDATE: 我已经扩大了这一问题,并提出了新的职位:根据我从这个问题得到了答案 Django - Map a OneToOneField to radio buttons on the admin interface

+1

需要更多的细节...... – erikvw

+0

你可以尝试重写小部件为您的布尔字段,而不是使用一个复选框收音机。 – Brandon

回答

3

那么你应该在一个加OneToOneField场:

class A(models.Model): 
    true_b = models.OneToOneField('B', related_name='is_true') 

    def save(self, *args, **kwargs): 
     if self.true_b not in self.b_set.all(): 
      raise ValueError('True_b has to be among those B that refer to this A') 
     super(A, self).save(*args, **kwargs) 

class B(models.Model): 
    a = models.ForeignKey(A) 
    ... 

还添加save()的方法来检查,如果A.true_bA.b_set项目,提高异常,如果它不是。您可以添加快捷方式方法B:

@property 
    def is_true(self): 
     return a.true_b == self 
+0

这看起来像我之后,但是,试图看到它的工作出现了另一个问题,现在因为'A'引用'B' in:'true_b = models.OneToOneField(B,reverse_name ='is_true')'和'B'在'a = models.ForeignKey(A)'中引用'A','A'正在引发:'NameError:名称'B'没有被定义' – abstractpaper

+0

写在引号中:'... Field 'B',...' –

+0

这个工作很好,你可能在'true_b = models.OneToOneField('B',reverse_name ='is_true')'的意思是'related_name'。但有一点,在管理界面中下拉列表是在B中的所有条目中生成的。我知道你所做的验证会处理关系,但是,是不是有办法生成仅与A有关的项目列表?更好的是,而不是有一个下拉列表,是否有可能利用'A'中的'true_b'在管理界面中使用单选按钮来反对'B'条目,这将指示'true_b'值? – abstractpaper

相关问题