【问题标题】:Can I save 2 entries to my models that are referencing each other?我可以将 2 个条目保存到相互引用的模型中吗?
【发布时间】:2021-01-30 09:49:25
【问题描述】:

我有 2 个模型,“Listing”和“Bid”
出价:

# bids and bidder
class Bid(models.Model):
    bid = models.IntegerField(default=10) #default soll durch user gesetzt werden

    # Foreign Keys
    bidder = models.ForeignKey(User, on_delete=models.CASCADE, related_name="bids")
    listing = models.ForeignKey(Listing, on_delete=models.CASCADE, related_name="bids")

上市:

# all information related to a listing
class Listing(models.Model):
    creation_date = models.DateTimeField(auto_now_add=True, null=True)
    title = models.CharField(max_length=100, null=True)
    description = models.CharField(max_length=100)
    image = models.URLField(max_length=200, default="https://user-images.githubusercontent.com/24848110/33519396-7e56363c-d79d-11e7-969b-09782f5ccbab.png")
    bid = models.IntegerField(default=10)
    auction_open = models.BooleanField(default=True)

    # Foreign Keys
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="listings")

place_bid():

def place_bid(request, listing_id):
    bidder = request.user
    bid = request.POST.get("bid")

    listing_entry = Listing.objects.get(pk=listing_id)

    bid_entry = Bid(listing=listing_entry, bid=bid, bidder=bidder)
    bid_entry.save()

    listing_entry.bid = bid_entry

    listing_entry.save()

    return;

在函数“place_bid()”中,我想创建一个新的“投标”实例,该实例使用外键引用已经存在的“列表”实例。
问题的出现是因为我接下来要执行的操作:我想更改刚刚引用的相同“列表”实例,我想将该列表对象的“投标”对象替换为我刚刚提到的那个“投标”对象已创建。
你能帮帮我吗:)

【问题讨论】:

    标签: python django django-models cs50


    【解决方案1】:

    首先,根据您的描述,我了解到每个 Bid 都有一个列表,但每个列表只有一个 Bid。如果是这种情况,我建议将字段的定义切换为 OneToOneField 而不是 ForiegnKey。

    def place_bid(request, listing_id):
        bidder = request.user
        bid = request.POST.get("bid")
    
        listing_entry = Listing.objects.get(pk=listing_id)
    
        # Here there is a small problem with your current models setup because each listing
        # can have several Bids. Here is a small patch for now. But I recommend that you change that to:
        # listing_entry.bid if you do chose to use OneToOneField there instead
        bid = listing_entry.bids.first()
        bid.update(listing=listing_entry, bid=bid, bidder=bidder)
        bid.save()
    
        return # no need for that: ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-29
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多