You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django词汇学习应用模型改造:支持双向多语言切换与扩展

优化Django词汇学习应用的多语言双向模型设计

核心问题分析

当前模型无法实现语言双向学习(如德语↔印尼语),需重复录入词汇;硬编码语言字段扩展性差,无法通过后台动态添加新语言并生成对应翻译输入项。

现有模型(参考)

class Language(models.Model):
    name = models.CharField(max_length=20)
    def __str__(self):
        return self.name


class Word(models.Model):
    word = models.CharField(max_length=50)

    def __str__(self):
        return self.word


class WordTranslation(models.Model):
    vocabulary = models.ForeignKey(Word, on_delete=models.CASCADE)
    language = models.ForeignKey(Language, on_delete=models.CASCADE)
    translation = models.CharField(max_length=50)

    def __str__(self):
        return f' {self.pk} {self.vocabulary}, {self.language}: {self.translation} '

    class Meta:
        unique_together = ['vocabulary', 'language', 'translation']

优化模型方案

重新设计模型,引入**语义概念(Concept)**作为核心,将不同语言的等价词汇关联到同一概念下,从根源解决双向切换问题,同时支持动态多语言扩展:

from django.db import models

class Language(models.Model):
    name = models.CharField(max_length=20, unique=True)
    
    def __str__(self):
        return self.name

class Concept(models.Model):
    # 可选:用于后台区分不同概念的描述
    description = models.CharField(max_length=100, blank=True, help_text="后台管理用:概念简短描述")
    
    def __str__(self):
        # 后台显示时,自动取第一个关联词汇代表该概念
        first_word = self.words.first()
        return first_word.word if first_word else f"概念 #{self.pk}"

class Word(models.Model):
    concept = models.ForeignKey(Concept, on_delete=models.CASCADE, related_name="words")
    language = models.ForeignKey(Language, on_delete=models.CASCADE)
    word = models.CharField(max_length=50)
    
    class Meta:
        # 确保同一概念下同一语言只有一个词汇
        unique_together = ["concept", "language"]
    
    def __str__(self):
        return f"{self.word} ({self.language.name})"

模型优势

  1. 双向学习无需重复录入:同一Concept下的所有Word互为翻译,比如德语Morgen和印尼语Pagi关联到同一概念后,可直接实现双向查询,无需重复添加数据。
  2. 动态多语言扩展:只需在后台添加新的Language实例,即可在Concept管理页添加对应语言的词汇,完全避免硬编码。
  3. 数据一致性:通过unique_together约束,确保同一概念下不会出现同一语言的重复词汇。

Admin后台适配(实现动态翻译字段)

通过InlineModelAdmin实现后台在Concept页面动态添加各语言词汇,符合你要求的“根据添加的语言动态生成对应翻译字段”的需求:

from django.contrib import admin
from .models import Language, Concept, Word

class WordInline(admin.TabularInline):
    model = Word
    extra = 1  # 默认显示1个额外输入框,方便添加新语言词汇

@admin.register(Concept)
class ConceptAdmin(admin.ModelAdmin):
    inlines = [WordInline]
    list_display = ["__str__", "description"]

@admin.register(Language)
class LanguageAdmin(admin.ModelAdmin):
    list_display = ["name"]

@admin.register(Word)
class WordAdmin(admin.ModelAdmin):
    list_display = ["word", "language", "concept"]
    list_filter = ["language"]

配置后,在后台添加/编辑Concept时,可直接通过内嵌的表单添加任意语言的词汇,无需修改代码即可适配新语言。

前端双向切换实现

视图逻辑(示例)

from django.shortcuts import get_object_or_404, render
from .models import Word, Language

def word_detail(request, word_id, from_lang_id, to_lang_id):
    from_lang = get_object_or_404(Language, pk=from_lang_id)
    to_lang = get_object_or_404(Language, pk=to_lang_id)
    source_word = get_object_or_404(Word, pk=word_id, language=from_lang)
    
    # 查找同一概念下的目标语言词汇
    target_word = source_word.concept.words.filter(language=to_lang).first()

    context = {
        "source_word": source_word.word,
        "source_lang": from_lang.name,
        "target_word": target_word.word if target_word else "暂无对应翻译",
        "target_lang": to_lang.name,
        # 提供反向查询的参数
        "reverse_from_lang_id": to_lang_id,
        "reverse_to_lang_id": from_lang_id,
        "reverse_word_id": target_word.pk if target_word else None
    }
    return render(request, "detail.html", context)

模板(detail.html)

<h1> What does <span style="color:red;">{{ source_word }}</span> mean in <span style="color:green;">{{ target_lang }}?</span></h1>
<p>翻译结果:{{ target_word }}</p>

{% if reverse_word_id %}
<a href="{% url 'word_detail' word_id=reverse_word_id from_lang_id=reverse_from_lang_id to_lang_id=reverse_to_lang_id %}">
    切换方向:查看 "{{ target_word }}" 在 "{{ source_lang }}" 中的含义
</a>
{% endif %}

这样用户可以一键切换学习方向,无需重复录入数据,完全满足双向学习需求。

内容的提问来源于stack exchange,提问作者KWunsch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:14:52