我可以将 2 个条目保存到相互引用的模型中吗?

Can I save 2 entries to my models that are referencing each other?

我有 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()”中,我想创建一个新的“Bid”实例,它使用外键引用一个已经存在的“Listing”实例。
问题出现是因为我接下来要做什么:我想更改刚刚引用的同一个“Listing”实例,我想将该 Listing 对象的“Bid”对象替换为我刚才的“Bid”对象已创建。
你能帮帮我吗:)

首先,根据您的描述,我了解到每个Bid都有一个listing,但每个listing只有1个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: ;