Django Rest框架多关系创建lin

2024-05-04 13:54:23 发布

您现在位置:Python中文网/ 问答频道 /正文

因为有一些关于m2m和DRF的问题,我会尽量缩小我感兴趣的范围。让我们称这两种模式为“文章”和“出版物”。假设:

  1. “publication”对象已存在。

  2. “article”对象可能存在,也可能不存在。具体来说:

    a)如果以前的出版物中包含该文章,则该文章已被删除 在那里。你知道吗

    b)如果没有,则需要创建文章。

  3. 我想用正文中的文章数据发送一个post-http请求 以及可从url获得的发布id,该url将:

    a)如果文章已经存在,请将其链接到出版物

    b)如果文章不存在,则创建它,然后将其链接到出版物

采取下面的“违约”策略是行不通的。我可以想出两种方法来解决这个问题:

  1. 重写项目序列化程序上的create方法。然而,我怀疑这样做,因为这似乎是一个问题,应该是共同的,有一个非定制的解决方案。你知道吗

    1. 创建端点以直接使用“through”模型。然后我可以将这个过程分为两个步骤(和两个请求),首先获取或创建文章,然后发布到through模型端点以创建链接。你知道吗

有没有其他方法或内置的DRF解决方案来解决这个问题?你知道吗

我现在的处境是:

你知道吗型号.py你知道吗

class Publication(models.Model):
    name = models.CharField(max_length=255, unique=True)
    collection = models.CharField(max_length=255)

class Article(models.Model):
    major = models.IntegerField()
    minor = models.IntegerField()
    publication = models.ManyToManyField(Publication)

    class Meta:
        constraints = [models.UniqueConstraint(fields=['major', 'minor'], name='unique_article')]

你知道吗视图.py你知道吗

class ArticleViewSet(viewsets.ModelViewSet):
    serializer_class = ArticleSerializer
    queryset = Article.objects.all()

你知道吗序列化程序.py你知道吗

class ArticleSerializer(serializers.ModelSerializer):
    publication = serializers.SlugRelatedField(slug_field='name', queryset=Publication.objects.all()), many=True)

    class Meta:
        model = Article
        fields = '__all__'

当发布到这个端点时,如果文章已经存在,而不是刚刚链接的文章,我会得到一个“重复条目”完整性错误。你知道吗


Tags: 方法namepy链接modelsarticle文章all
1条回答
网友
1楼 · 发布于 2024-05-04 13:54:23

这是我过去处理这个问题的方式。如果您使用主键,这些调用不会很昂贵。你知道吗

pub = Publications.objects.get(id=1)


article, created = Articles.objects.get_or_create(
id=1,
defaults= {other_params:'value', param : 'value'},
) 

pub.articles.add(article)

相关问题 更多 >