简体   繁体   English

验证 Django 中的 model 字段时访问其他 model 字段

[英]Accessing other model field when validating model field in Django

So I have a Django auctions app, which has 4 models: Users, Listings, Bids, Comments.所以我有一个 Django 拍卖应用程序,它有 4 个模型:用户、列表、投标、评论。
When a user tries to place a bid on some listing, I want to check whether bid_amount field in Bid model is smaller than start starting_bid field in Listing model.当用户尝试对某个列表出价时,我想检查Bid model 中的bid_amount字段是否小于Listing model 中的starting_bid字段。
Also, I wanted to ask, what is the best practice for this kinda stuff?另外,我想问一下,这种东西的最佳做法是什么? AFAIK, you can validate a form field in forms.py . AFAIK,您可以验证forms.py中的表单字段。
Thanks!谢谢!

models.py模型.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

adding this to the clean method of Bid solve the problem for you.将此添加到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")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM