【问题标题】:Accessing other model field when validating model field in Django在 Django 中验证模型字段时访问其他模型字段
【发布时间】:2020-11-29 09:03:40
【问题描述】:

所以我有一个 Django 拍卖应用程序,它有 4 个模型:用户、列表、投标、评论。
当用户尝试对某个列表出价时,我想检查Bid 模型中的bid_amount 字段是否小于Listing 模型中的开始starting_bid 字段。
另外,我想问一下,这种东西的最佳做法是什么? AFAIK,您可以验证forms.py 中的表单字段。
谢谢!

models.py

class Listing(models.Model):
    """Auction listing"""
    user = models.ForeignKey(User, verbose_name='user owner', on_delete=models.CASCADE, related_name="usr_listings")
    title = models.CharField(max_length=64)
    description = models.TextField(max_length=160)
    starting_bid = models.PositiveIntegerField()
    bids_number = models.PositiveIntegerField(default=1)
    img_url = models.URLField("Image URL", max_length=200, blank=True)
    category = models.CharField(max_length=64, blank=True)
    date_listed = models.DateTimeField(default=timezone.now)

    class Meta:
        verbose_name = 'auction listing'
        ordering = ['-date_listed']

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        print('loading... get_absolute_url')
        return reverse('listing_detail', kwargs={'pk': self.pk})


class Bid(models.Model):
    """Bids made on auction listing"""
    listing = models.ForeignKey(Listing, on_delete=models.CASCADE, related_name="listing_bids")
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user_bidder")
    bid_amount = models.PositiveIntegerField(default=None)

    class Meta:
        verbose_name = 'Bid'

    def __str__(self):
        return f'{self.bid_amount} by {self.user} on {self.listing}'

    def clean(self):
        super().clean()
        # do something to access Listing.starting bid, and Listing.user

【问题讨论】:

    标签: python django django-class-based-views


    【解决方案1】:

    将此添加到Bidclean 方法中为您解决问题。

    from django.core.exceptions import ValidationError
    
    ...
    
    if self.bid_amount < self.listing.starting_bid:
        raise ValidationError("bid_amount must be greater than or equal to starting_bid of the listing")
    

    【讨论】:

    • 试过了,报错auctions.models.Bid.listing.RelatedObjectDoesNotExist: Bid has no listing.
    • 如何创建Bid?我假设您在创建新对象时提供了现有的 Listing
    • 如果这就是您的意思,列表中有一个外键
    • 我的意思是,如果您使用已经存在的 Listing 对象创建 Bid 对象,它应该可以正常工作。假设您确实有一个名为 listing_objListing 对象,并且您创建了一个新的 Bid,如下所示:Bid(listing=listing_obj, user=current_user, bid_amount=10).save()
    • 好的,如果错误是您提到的错误,这意味着您在提供数据库中不存在的Listing 对象的过程中的某个地方。也许你还没有打电话给save!?
    猜你喜欢
    • 2019-03-22
    • 2019-12-24
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2012-06-09
    相关资源
    最近更新 更多