[英]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.将此添加到
Bid
的clean
方法为您解决问题。
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.