将一条记录限制为django模型中的默认值

时间:2016-07-09 11:37:49

标签: django

在django

中仅限制一条记录的最佳方法是什么?

我有一个模型,我有一个默认的标志

class BOMVersion(models.Model): 
    name = models.CharField(max_length=200,null=True, blank=True)
    material =  models.ForeignKey(Material)   
    is_default = models.BooleanField(default=False)

我想只有一个值是相同材质的默认值,但这个材质可能有很多非默认值。

3 个答案:

答案 0 :(得分:1)

如果设置为静态,请将其保存在settings.py中。 将其保存为单独的"默认"具有一条记录的表格(或使用最新的记录),如果它是动态的。

将默认值保存在另一个表中,如下所示:

class BOMVersion(models.Model): 
   name = models.CharField(max_length=200,null=True, blank=True)
   material =  models.ForeignKey(Material)   
class BOMVersionDefault(model.Models)
   time_set= models.Datetime(auto_created=True)
   default_material = models.ForiegnKey(Material)

查询:

default = BOMVerDefault.objects.latest(time_set).get().default_material

如果您有多种材质类型,每种材质都需要默认值,那么default_material将是材质类型表中的一个字段。

答案 1 :(得分:1)

这个问题没有得到更频繁的解决,这很奇怪。如果我有一个默认记录,我想在类中记录它作为成员变量。并确定实例是否是默认值,我想比较类默认成员变量和实例ID。不幸的是,我无法弄清楚如何在Python中的同一个类函数中很好地访问类变量和实例变量(可能有人可以评论),但这并不需要在默认情况下访问数据库或存储指向的一堆记录默认。只是班上的一个成员变量。

在我写完之后,我意识到每次重启应用程序时,默认都会重置为None,因此您必须将其存储在数据库中。我已相应更新了我的答案。但是,检查成员变量是否为空,并且只检查数据库是否会减少此处的命中。我使用的模型是:

class RecordOfInterest(models.Model):
"""
Record Records of interest here. Stores ID, and identifying character
"""
# asume maximum 64 character limit for the model.
model_name = models.CharField(max_length=64, unique=True)
record_no = models.IntegerField()
human_ident = models.CharField(max_length=64, help_text='How is this of interest') 
# Id it as default, deposit, ... Don't bother indexing, as there will only be a few

def __unicode__(self):
    return u'Model %s record %d for %s' % (self.model_name, self.record_no, self.human_ident)

class Meta:
    unique_together = ('model_name', 'human_ident')

class Product(models.Model):
    """
    Allow one product record to be the default using "Product.default = prod_instance"
    check default with "Product.is_default(prod_instance)"
    """
    default = None # set this to id of the default record
    cart_heading = models.CharField(max_length=64, blank=True)
    country = CountryField()
    pricing = models.ForeignKey(
        'Price', blank=True, null=True, related_name='visas', on_delete=models.SET_NULL)

    @classmethod
    def is_default(cls, obj):
        if cls.default_no == None:
            try:
                cls.default_no = RecordOfInterest.objects.get(model_name=cls.__name__, human_ident='default')
            except RecordOfInterest.DoesNotExist: 
                default_no = None
        return cls.default_no == obj.id

@classmethod
def set_default(cls, obj):
    try:
        default_rec = RecordOfInterest.objects.get(model_name=cls.__name__, human_ident='default')
    except RecordOfInterest.DoesNotExist:
        RecordOfInterest.objects.create(model_name=cls.__name__, record_no=obj.id, human_ident='default')
    else:
        if default_rec.record_no != obj.id:
            default_rec.record_no = obj.id
            default_rec.save()
    cls.default_no = obj.id
    return

答案 2 :(得分:0)

在表中花费一个小时是我们开发人员面对面的最基本要求,花了几个小时之后,我认为在Django中一个整洁干净的解决方案是将所有记录更新为默认false表单实例的默认值为“ true”,然后保存记录。

class FeeLevelRate(TimeStampedModel):
    """ 
    Stores the all the fee rates depend on feelevel
    """
    feelevel = models.ForeignKey(FeeLevel, on_delete= models.PROTECT)
    firstconsultfee = models.DecimalField(_('First Consultation Charges'),max_digits=10,decimal_places=2,blank=True)
    medcharges = models.DecimalField(_('Medicines Charges per Day'),max_digits=10,decimal_places=2,blank=True)
    startdate = models.DateField(_("Start Date "), default=datetime.date.today)
    default_level = models.BooleanField(_('Is Default Level?'),default=False)

    class Meta:
        constraints = [
                models.UniqueConstraint(fields=["feelevel","startdate"], name='unique_level_per_date'),
            ]
    

    def __str__(self):
        return "%s applicable from (%s)" % ( self.feelevel,  self.startdate.strftime("%d/%m/%Y"))
class FeeLevelRateCreate(CreateView):
    model = FeeLevelRate
    fields = ['feelevel', 'firstconsultfee', 'medcharges', 'startdate', 'default_level']
    context_object_name = 'categories'
    success_url = reverse_lazy('patadd:feerate_list')
    def form_valid(self, form):
        # Update all the default_level with false.
        #UserAddress.objects.filter(sendcard=True).update(sendcard=False)
        if form.instance.default_level:
            FeeLevelRate.objects.filter(default_level=True).update(default_level=False)
        return super().form_valid(form)